如何使用 PowerShell 替换多台计算机上文件中的一行
How to replace a line in a file on multiple computers using PowerShell
我正在尝试用 Powershell 替换多台 PC 上 test.ini 文件中的一行。
但是我需要用不同的内容替换 test.ini 文件中的这一行。
例如:
- PC st1:在 test.ini 文件第 10 行我有“你好”,我需要替换
用“嗨”
- PC st2:在 test.ini 文件第 10 行中,我有“你好”,我需要替换
与“再见”
我创建了一个脚本,但不明白如何在多台 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'
}
}
我正在尝试用 Powershell 替换多台 PC 上 test.ini 文件中的一行。 但是我需要用不同的内容替换 test.ini 文件中的这一行。 例如:
- PC st1:在 test.ini 文件第 10 行我有“你好”,我需要替换 用“嗨”
- PC st2:在 test.ini 文件第 10 行中,我有“你好”,我需要替换 与“再见”
我创建了一个脚本,但不明白如何在多台 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'
}
}