使用 PowerShell 脚本替换 DLL 版本信息中的内部版本号

Using PowerShell script to replace build number in DLL version info

我是 PowerShell 的新手,用我的 SVN 存储库中的修订号替换我的 DLL 中的内部版本号(通过修改 .rc 文件)似乎是一种合理的方法。

使用 PowerShell ISE,我创建了以下变量:

 = "123"
$revision = "230"

现在我正在使用以下命令测试我的字符串替换,以查看它的行为与我在网上阅读的内容的对比。我希望找到可以返回 12,3,0,230:

文件版本的东西
$pattern = '(^\s*FILEVERSION\s*[0-9]+,[0-9]+,[0-9]+,)[0-9]+$'

' FILEVERSION 12,3,0,0' -replace $pattern, "`"
# returns " FILEVERSION 12,3,0,"

' FILEVERSION 12,3,0,0' -replace $pattern, ""
# returns "123"

' FILEVERSION 12,3,0,0' -replace $pattern, ''
# returns " FILEVERSION 12,3,0,"

' FILEVERSION 12,3,0,0' -replace $pattern, "`$revision"
# returns "30"

' FILEVERSION 12,3,0,0' -replace $pattern, "``$revision"
# returns " FILEVERSION 12,3,0,$revision"

' FILEVERSION 12,3,0,0' -replace $pattern, "$revision`"
# returns "230 FILEVERSION 12,3,0,"

我对尝试 4 和 6 的结果感到惊讶。对于尝试 4,为什么 PowerShell 没有将 $revision 替换为“230”?同样对于尝试 6,为什么它在 ` 之前被正确替换?我在反引号的替换字符串中查找有关范围界定的信息,但没有找到任何信息。

在替换操作中,PowerShell 首先扩展 PowerShell 变量,然后再将匹配和替换字符串交给正则表达式引擎。因此替换字符串 "`$revision" 被扩展为 "30" 并传递给正则表达式引擎。由于没有要扩展的第 1230 个捕获组,因此反向引用保持原样。

为避免此问题,请将反向引用标识符放在大括号中:

'FILEVERSION 12,3,0,0' -replace '...', "`$revision"

确保您的替换字符串由反向引用 </code> 和字符串 <code>230.

组成

关于其他方法正在做什么的注释(为了完整起见):

' FILEVERSION 12,3,0,0' -replace '...', "`"

Returns " FILEVERSION 12,3,0," 因为整个匹配被替换为对第一个捕获组的反向引用,没有别的。

' FILEVERSION 12,3,0,0' -replace '...', ""

Returns "123" 因为 PowerShell 在将 变量 </code> 传递给正则表达式引擎之前对其进行了扩展。后者只看到字符串 <code>"123".

' FILEVERSION 12,3,0,0' -replace '...', ''

与第一种方法相同的行为(单引号阻止 PowerShell 扩展变量 </code>,就像转义 <code>$ 一样)。

' FILEVERSION 12,3,0,0' -replace '...', "``$revision"

Returns " FILEVERSION 12,3,0,$revision" 因为两个 $ 都被转义了,所以 PowerShell 不会扩展 $revision,对于正则表达式引擎 $revision 只是一个普通字符串.

' FILEVERSION 12,3,0,0' -replace '...', "$revision`"

Returns "230 FILEVERSION 12,3,0," 因为 PowerShell 扩展了 $revision,但是这次值位于反向引用之前,所以正则表达式引擎可以扩展 到第一个捕获的组.