如何使用 PowerShell 替换多台计算机上文件中的一行

How to replace a line in a file on multiple computers using PowerShell

我正在尝试用 Powershell 替换多台 PC 上 test.ini 文件中的一行。 但是我需要用不同的内容替换 test.ini 文件中的这一行。 例如:

我创建了一个脚本,但不明白如何在多台 PC 上更改具有不同内容的同一行(

 $devices = Get-Content "C:\script\device.txt"

foreach ($computer in $devices) {

Invoke-Command -ComputerName $computer -scriptblock {
((Get-Content -path C:\test\test.ini -Raw) -replace 'hello','world') | Set-Content -Path C:\test\test.ini
Get-Content -path C:\test\test.ini | Select -Index 10 }

}

如果我能做到,请帮忙。

好的,这就是我的意思。

不要只包含计算机名称的文本文件,而是将其制作成 CSV 文件,例如 已经评论

ComputerName,SearchWord,Replacement
C2712,hello,hi
C1278,hello,bye
C2452,hello,again

现在您已将计算机名称、搜索词和该特定计算机的替代词集于一身,然后您可以执行以下操作:

$devices = Import-Csv "C:\script\device.csv"

foreach ($computer in $devices) {
    Invoke-Command -ComputerName $computer.ComputerName -ScriptBlock {
        param(
            [string]$findThis,
            [string]$replaceWith
        )
        # -replace uses regex, so the $findThis string needs to be escaped because it may or may not
        # contain characters that have special meaning in Regular Expressions.
        (Get-Content -Path 'C:\test\test.ini' -Raw) -replace [regex]::Escape($findThis), $replaceWith | Set-Content -Path 'C:\test\test.ini'
    } -ArgumentList $computer.SearchWord $computer.Replacement
}

如果由于某种原因无法创建 CSV 文件,那么您就会遇到像

这样乏味的代码
$devices = Get-Content "C:\script\device.txt"

foreach ($computer in $devices) {
    # for each computer, define what is to be replaced by what
    switch ($computer) {
        'C2712' { $find = 'hello'; $replace = 'hi' }
        'C1278' { $find = 'hello'; $replace = 'bye' }
        'C2452' { $find = 'hello'; $replace = 'again' }
        # etcetera etcetera..
    }
    Invoke-Command -ComputerName $computer -ScriptBlock {
        # -replace uses regex, so the $findThis string needs to be escaped because it may or may not
        # contain characters that have special meaning in Regular Expressions.
        (Get-Content -Path 'C:\test\test.ini' -Raw) -replace [regex]::Escape($using:find), $using:replace | Set-Content -Path 'C:\test\test.ini'
    }
}