gpt4 book ai didi

powershell - 替换字符串而不替换文件powershell的全部内容

转载 作者:行者123 更新时间:2023-12-02 23:10:14 25 4
gpt4 key购买 nike

尝试编辑文件的这一行(“VoIP.Enabled“1”)。我想将1更改为零。

$dewprefs = Get-Content .\dewrito_prefs.cfg

$dewprefs | Select-String "VoIP.Enabled" | ForEach-Object {$_ -replace "1","0"} | Set-Content .\dewrito_prefs.cfg}`

但是,当我使用此脚本时,它将删除其他100行,编辑右行,然后删除所有其他内容,仅保留我要编辑的行。

在此问题上的任何帮助将不胜感激

最佳答案

Select-String充当过滤器:即,给定的输入仅在与模式匹配时才传递。

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

如果所有输入行(尽管可能已修改)都应通过,则不要使用Select-String;仅使用ForEach-Object,并有条件地修改每条输入行:

$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语句的两个分支如何产生输出:
  • $_ -replace '1', '0'输出将输入行中所有1实例替换为0的结果
  • $_仅按原样传递输入行。


  • 但是,很可能您可以用单个 if表达式替换 -replace语句,并且,假设文件足够小以至于可以整体读取(对于配置文件,很可能是这样),则可以使用 Stu's helpful simplification

    充分利用 -replace支持正则表达式(正则表达式)这一事实,该代码可以仅基于键名(例如 VoIP.Enabled)更新行,而无需知道该键的当前值。
    $key = 'VoIP.Enabled'
    $newValue = '1'

    # Construct a regex that matches the entire target line.
    $regex = '^\s*' + [regex]::Escape($key) + '\b.*$'
    # Build the replacement line.
    $modifiedLine = "$key $newValue"

    (Get-Content .\dewrito_prefs.cfg) -replace $regex, $modifiedLine | Set-Content .\dewrito_prefs.cfg

    请注意,将输出写回到输入文件中的操作仅有效,因为由于将 Get-Content调用包含在 (...)中,因此将输入文件从整体上读取到内存中。

    关于powershell - 替换字符串而不替换文件powershell的全部内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43599780/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com