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

使用PowerShell脚本替换DLL版本信息中的内部版本号,powershell,powershell-2.0,Powershell,Powershell 2.0,我是PowerShell新手,用SVN存储库中的修订号替换DLL中的内部版本号(通过修改.rc文件)似乎是一种合理的方法 使用PowerShell ISE,我创建了以下变量: $1 = "123" $revision = "230" 现在,我正在使用以下命令测试字符串替换,以查看它的行为与我在线阅读的内容的对比。我希望能找到一些东西,把12,3,0230的文件版本还给我: $pattern = '(^\s*FILEVERSION\s*[0-9]+,[0-9]+,[0-9]+,)[0-9]+$'

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

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

$1 = "123"
$revision = "230"
现在,我正在使用以下命令测试字符串替换,以查看它的行为与我在线阅读的内容的对比。我希望能找到一些东西,把
12,3,0230
的文件版本还给我:

$pattern = '(^\s*FILEVERSION\s*[0-9]+,[0-9]+,[0-9]+,)[0-9]+$'

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

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

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

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

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

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

我对尝试4和6的结果感到惊讶。对于尝试4,为什么PowerShell不将
$revision
替换为“230”?同样在尝试6中,当它出现在$1之前时,为什么会被正确地替换?我在替换字符串中查找了有关反勾号范围的信息,但没有找到任何内容。

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

要避免此问题,请将backreference标识符放在花括号中:

'FILEVERSION 12,3,0,0' -replace '...', "`${1}$revision"
这确保替换字符串由反向引用
$1
和字符串
230
组成


关于其他方法的说明(为了完整性):

返回
“FILEVERSION 12,3,0,”
,因为整个匹配被替换为对第一个捕获组的反向引用,而没有其他内容

返回
“123”
,因为PowerShell会在变量
$1
传递给regexp引擎之前展开该变量。后者只看到字符串
“123”

与第一种方法的行为相同(单引号阻止PowerShell扩展变量
$1
,就像对
$
进行转义一样)

返回
“FILEVERSION 12,3,0,$revision”
,因为这两个
$
都是转义的,所以PowerShell不会展开
$revision
,而对于regexp引擎
$revision
只是一个普通字符串


返回
“230文件版本12,3,0,”
,因为PowerShell扩展了
$revision
,但这次该值位于backreference之前,因此regexp引擎可以将
$1
扩展到第一个捕获的组。

谢谢!!!这就成功了。现在我更了解这种扩展,完全有道理。
' FILEVERSION 12,3,0,0' -replace '...', "`$1"
' FILEVERSION 12,3,0,0' -replace '...', "$1"
' FILEVERSION 12,3,0,0' -replace '...', '$1'
' FILEVERSION 12,3,0,0' -replace '...', "`$1`$revision"
' FILEVERSION 12,3,0,0' -replace '...', "$revision`$1"