Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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,正在尝试编辑文件VoIP的此行。已启用1。我想把1改成0。当我把它换成 $dewprefs = Get-Content .\dewrito_prefs.cfg $dewprefs | Select-String "VoIP.Enabled" | ForEach-Object {$_ -replace "1","0"} | Set-Content .\dewrito_prefs.cfg}` 但是,当我使用这个脚本时,它会删除100行其他内容,编辑右边的内容,然后删除所有内容,只留下我想要编辑的

正在尝试编辑文件VoIP的此行。已启用1。我想把1改成0。当我把它换成

$dewprefs = Get-Content .\dewrito_prefs.cfg

$dewprefs | Select-String "VoIP.Enabled" | ForEach-Object {$_ -replace "1","0"} | Set-Content .\dewrito_prefs.cfg}`
但是,当我使用这个脚本时,它会删除100行其他内容,编辑右边的内容,然后删除所有内容,只留下我想要编辑的内容

如果您能在这方面提供任何帮助,我们将不胜感激。

选择字符串充当过滤器:也就是说,它所提供的输入只有在与模式匹配时才会传递出去

因此,只将感兴趣的行写入输出文件

如果所有输入行(尽管可能已修改)都要通过,则不要使用Select字符串;仅使用ForEach对象,并有条件地修改每个输入行:

$dewprefs = Get-Content .\dewrito_prefs.cfg

$dewprefs |
  ForEach-Object { if ($_ -match 'VoIP\.Enabled') { $_ -replace '1', '0' } else { $_ } } | 
    Set-Content .\dewrito_prefs.cfg
$\ match'VoIP\.Enabled'现在执行Select String在原始命令中所做的操作:仅当手边的输入行包含文字VoIP时,它才匹配。Enabled请注意。转义为\。以确保在正则表达式的上下文中将其视为文本

请注意if语句的两个分支如何生成输出:

$\替换“1”,“0”输出将输入行中1的所有实例替换为0的结果

$只需按原样传递输入行

但是,最有可能的情况是可以使用单个替换表达式替换if语句,并且假设文件足够小,很可能可以作为一个整体读取,在配置文件的情况下,可以使用的变体

充分利用-replace支持正则表达式这一事实,代码可以基于密钥名(如VoIP.Enabled)更新行,而无需知道该密钥的当前值


请注意,将输出写回输入文件只会起作用,因为输入文件是作为一个整体预先读取到内存中的,这是因为它包含了Get Content调用….

对于PowerShell v3+,这也会起作用,而且更简洁一些:

(Get-Content .\dewrito_prefs.cfg).replace('"VoIP.Enabled "1"', '"VoIP.Enabled "0"') | 
    Set-Content .\dewrito_prefs.cfg

您的报价有点奇怪,总共有3个双引号?不过,我模仿了您的要求。

这非常有效,我知道我错在哪里了,谢谢。这似乎更符合我的要求,报价包含服务器配置值。你能帮我扩展一下你上面写的吗。如果我想获取引号之间的数据并编辑它,但不知道它是什么,我会以这个数据为例。Server.Name Random Server Name$Name=读取主机-提示“输入服务器名称”获取内容。\dewrito_prefs.cfg.替换“Server.Name*”、“Server.Name$Name”|设置内容。\dewrito_prefs.cfg++用于更简单的方法@以太:对于不依赖于知道当前值的通用替换,您必须使用-replace运算符,它使用正则表达式,而不是.replace方法,该方法适用于文本-我更新了我的答案以进行演示。
(Get-Content .\dewrito_prefs.cfg).replace('"VoIP.Enabled "1"', '"VoIP.Enabled "0"') | 
    Set-Content .\dewrito_prefs.cfg