我正在编写一个批处理脚本,我试图替换prop文件中的值。我使用PowerShell替换代码,因为我在批处理脚本中找不到任何类似的方法。
powershell -Command "(gc %PROPFILEPATH%) -replace '%FTPoldfilepath%', '%FTPnewfile%' | Set-Content %PROPFILEPATH%"
变量%PROPFILEPATH%
,%FTPoldfilepath%
和%FTPnewfile%
包含双反斜杠(例如:C:\\testing\\feed
)
我意识到反斜杠需要转义,任何人都可以指导我如何在这里实现转义函数。
答案 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中编写整个脚本。它通常会让事情变得更容易。