Powershell中的字符串替换在不同的Windows版本中有所不同

Powershell中的字符串替换在不同的Windows版本中有所不同,powershell,windows-8.1,powershell-3.0,windows-server-2012,powershell-4.0,Powershell,Windows 8.1,Powershell 3.0,Windows Server 2012,Powershell 4.0,以下PowerShell脚本: $srch = '-v\s*(.*?)\s*=\s*%1' $repl = "-v `'`$1'` = %1" (Get-Content batchfile.bat) -replace $srch, $repl | Set-Content rave.bat 从Windows 8.1计算机生成以下结果: sqlcmd -S rave -v 'test me' = %1 -i rave_params.sql -o alert.txt sqlcmd-S rave-v'

以下PowerShell脚本:

$srch = '-v\s*(.*?)\s*=\s*%1'
$repl = "-v `'`$1'` = %1"
(Get-Content batchfile.bat) -replace $srch, $repl | Set-Content rave.bat
从Windows 8.1计算机生成以下结果:

sqlcmd -S rave -v 'test me' = %1 -i rave_params.sql -o alert.txt
sqlcmd-S rave-v'test me'=%1-i rave_params.sql-o alert.txt
同一脚本从Windows 2012服务器生成以下结果:

sqlcmd -S rave -v test me = %1 -i rave_params.sql -o alert.txt
sqlcmd-S rave-v test me=%1-i rave_params.sql-o alert.txt

脚本应该产生在文本周围留下单引号的结果。它可以在Windows 8.1计算机上正常工作,但在Windows Server 2012上无法正常工作。有什么办法可以在Windows Server 2012上生成相同的结果吗?

没有示例输入很难测试,但这会给您带来更好的结果吗

$srch = '-v\s*(.*?)\s*=\s*%1'
$repl = @'
-v '$1' = %1
'@

是否可以提供一个生成输出结果的示例字符串?$repl字符串中的第二个单引号是否在引号之前而不是之后有反勾号?这两个系统上是否有不同版本的powershell?Windows 8.1附带powershell v4,Windows Server 2012(不是R2)附带powershell v3。此外,您的代码似乎有一个输入错误。
$repl
中的最后一个反勾在单引号之前。是的,我认为这将是一个.NET 2.0 vs 4.0的问题。但是我看到的对.NET正则表达式的唯一更改是在4.5-
中限制正则表达式引擎在其超时之前尝试解析正则表达式的时间。请参阅Regex.MatchTimeout属性。
2012服务器正在运行Powershell 4,因为我已将其更新为与Win 8 box上的相同PS版本相匹配。您的代码可以很好地替换文本。尽管在写入新文件后,它仍然没有在testme周围提供单引号。我似乎无法让powershell将文本输出为“test me”,并在txt周围加上单引号。您可以发布.bat文件的原始文本,以便我可以根据您的数据进行测试吗?以下是batchfile.bat->sqlcmd-S rave-v test me=%1-I rave_params.sql-o alert.txt的内容,以及替换文件的外观rave.bat->sqlcmd-S rave-v'test me'=%1-i rave_params.sql-o alert.txtI刚刚在2012标准服务器操作系统(PS V3)上测试了这一点,我得到了引号中的“test me”。我相信你。我不明白为什么它没有在这个新生成的、经过修补的2012服务器上为我输出这些信息。正如我前面提到的,它在Win8工作站上工作得很好,但在服务器上不能正常工作。服务器只是一个SQL框,而IIS只是一个。