使用 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
,但是这次值位于反向引用之前,所以正则表达式引擎可以扩展
到第一个捕获的组.
我是 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
,但是这次值位于反向引用之前,所以正则表达式引擎可以扩展 到第一个捕获的组.