2017-04-09 89 views
2

我是PowerShell的新手,它似乎是一种合理的方式,用我的SVN仓库中的版本号替换我的DLL中的内部版本号(通过修改.rc文件) 。使用PowerShell脚本替换DLL版本信息中的内部版本号

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

$1 = "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, "`$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不要用“230”替代$revision ?同样尝试6,为什么它在`$1之前正确地被替换?我在替代字符串中查找有关反引号的范围的信息,但没有发现任何内容。

回答

5

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

为了避免这个问题,把大括号中的反向引用标识:

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

从而确保您的替换字符串包括反向引用$1和字符串230的。


注意什么其他的方法都在做(为完整起见):因为整场比赛被替换

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

返回" FILEVERSION 12,3,0,"与反向引用第一个捕获组没有别的。

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

返回"123"因为PowerShell中之前它传递给正则表达式引擎扩展变量$1。后者只看到字符串"123"

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

相同的行为与第一种方法(单引号防止PowerShell与扩大可变$1就像逃离$一样)。

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

返回" FILEVERSION 12,3,0,$revision",因为这两个$被转义,所以PowerShell不会扩大$revision,并为正则表达式引擎$revision只是一个普通的字符串。

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

返回"230 FILEVERSION 12,3,0,"因为PowerShell的扩展$revision,但这次的值代表反向引用过,所以正则表达式引擎可以扩大$1到捕获的第一组。

+0

谢谢!那就是诀窍。现在我更了解这种扩张,完全合理。 – Dave