Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PowerShell替换文件中的字符串_Powershell - Fatal编程技术网

使用PowerShell替换文件中的字符串

使用PowerShell替换文件中的字符串,powershell,Powershell,我正在尝试替换另一个PowerShell文件中的一些字符串 $Source_IP = Read-Host 'Enter source IP' $Target_IP = Read-Host 'Enter target IP' 通过在另一个PowerShell脚本中使用以下行,文件显示为已修改,但更改不会生效 (Get-Content "C:\Solutions.ps1") -replace "$Target_IP = Read-Host 'Enter target IP'", "$Target_

我正在尝试替换另一个PowerShell文件中的一些字符串

$Source_IP = Read-Host 'Enter source IP'
$Target_IP = Read-Host 'Enter target IP'
通过在另一个PowerShell脚本中使用以下行,文件显示为已修改,但更改不会生效

(Get-Content "C:\Solutions.ps1") -replace "$Target_IP = Read-Host 'Enter target IP'", "$Target_IP = '192.168.0.221'" | Set-Content "C:\Solutions.ps1"
有没有一个原因使这些改变不能生效

这是在Windows Server 2008和PowerShell版本2上以管理员身份运行的。

因为
-replace
比较运算符支持regex。虽然您的模式中可以有某种程度的表达式,但这增加了不必要的复杂性,特别是因为您只是使用简单的匹配

更简单的解决方案是使用字符串方法
.Replace()


请注意,
.Replace()
区分大小写。如果你只是更换IP地址,这是一个没有实际意义的问题。我不确定您为什么对第二个文件有问题

只需指出,正如前面所述,-replace运算符支持正则表达式,在正则表达式中,您必须用\转义搜索字符串中的特殊字符,如$,而且您使用的是双引号字符串,因此您必须在搜索字符串和replace字符串中的$with powershell转义字符`之前转义,因此命令应该是(现在无法尝试):


1) 双引号字符串文字展开变量。2)
-replace
使用正则表达式。本地脚本中不存在变量,只有远程脚本,因此我认为扩展不会有问题。但是正则表达式。。。也许。无论如何,要让它处理这些问题,只需替换2个文本字符串即可?
(获取内容“C:\Solutions.ps1”)| ForEach对象{$\替换($Source\u IP,$Target\u IP)}|设置内容“C:\Solutions.ps1”
?只是简单地匹配没有正则表达式。@Matt这就行了,(获取内容“C:\Solutions.ps1”)| ForEach对象{$\u0.Replace($old\u string,$new\u string)}|为第一个文件设置内容“C:\Solutions.ps1”。当我对第二个文件运行相同的命令时,它不会生效。也许有一个限制,我只能这样做一次每个ps1文件?我可以问你为什么需要管道输出字符串?它不能只是(获取内容$filePath)。替换(…?@POliveira)它不应该是必需的或必需的。它一定是我正在测试的东西,但忘了取出。想不出我为什么把它放在那里的原因。可能是psv2的问题。或者其他什么。不管怎样,我都要取出它。
$filePath = "C:\Solutions.ps1"
(Get-Content $filePath).Replace($Source_IP,$Target_IP) | Set-Content $filePath
(Get-Content "C:\Solutions.ps1") -replace "\`$Target_IP = Read-Host 'Enter target IP'", "`$Target_IP = '192.168.0.221'" | Set-Content "C:\Solutions.ps1"