Powershell替换函数具有转义字符

时间:2015-05-13 20:26:53

标签: regex powershell batch-file escaping

我正在编写一个批处理脚本,我试图替换prop文件中的值。我使用PowerShell替换代码,因为我在批处理脚本中找不到任何类似的方法。

powershell -Command "(gc %PROPFILEPATH%) -replace '%FTPoldfilepath%', '%FTPnewfile%' | Set-Content %PROPFILEPATH%"

变量%PROPFILEPATH%%FTPoldfilepath%%FTPnewfile%包含双反斜杠(例如:C:\\testing\\feed

我意识到反斜杠需要转义,任何人都可以指导我如何在这里实现转义函数。

2 个答案:

答案 0 :(得分:1)

使用双反斜杠。如果它们翻倍或甚至三倍都不会受伤。

您需要使用$ENV:PROFILEPATH$ENV:FTPoldfilepath$ENV:FTPnewpath代替%PROPFILEPATH%'%FTPoldfilepath%''%FTPnewfile%'

如果您的目标是加载当前路径,请将旧路径替换为旧路径并保存新路径,请考虑使用完整脚本而不是单个命令:

$oldftppath = 'c:\some\path'
$newftppath = 'c:\new\path'
$newpath = $ENV:PROFILEPATH.replace($oldftppath,$newftppath)

然而它变得棘手。如果您需要一个persicent环境变量,您需要使用.NET框架来设置它。 https://technet.microsoft.com/en-us/library/ff730964.aspx

[Environment]::SetEnvironmentVariable("TestVariable", "Test value.", "User")

所以,使用这种语法:

[Environment]::SetEnvironmentVariable("PROFILEPATH", "$newpath", "User")

或者它可能是上下文的“机器”。

答案 1 :(得分:1)

首先,正如@Xalorous提到的那样,您必须使用PowerShell语法来访问环境变量:

powershell -Command "(gc $env:PROPFILEPATH) -replace $env:FTPoldfilepath, $env:FTPnewfile | Set-Content $env:PROPFILEPATH"

此外,只需要转义搜索字符串,而不是替换字符串。您可以使用Escape()类的regex方法:

powershell -Command "(gc $env:PROPFILEPATH) -replace [regex]::Escape($env:FTPoldfilepath), $env:FTPnewfile | Set-Content $env:PROPFILEPATH"

此处需要转义,因为-replace operator将搜索字符串视为正则表达式。

但是,由于您显然只想要一个简单的字符串替换,而不是正则表达式匹配,您也可以使用源字符串的Replace()方法:

powershell -Command "(gc $env:PROPFILEPATH) | % { $_.Replace($env:FTPoldfilepath, $env:FTPnewfile) } | Set-Content $env:PROPFILEPATH"

作为旁注,由于您无论如何都要使用PowerShell,因此您应该认真考虑在PowerShell中编写整个脚本。它通常会让事情变得更容易。