我尝试替换不在我们域中的设备上的.ini文件中的某些行。我需要使用本地管理员帐户执行copy / paste-item和get / set-content cmdlet。所有设备的IP都在一个单独的文本文件中。有人能告诉我,我如何以本地管理员身份执行我的cmdlet?
$user = ".\administrator"
$pass = ConvertTo-SecureString "password" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user,$pass
$IP_Array = (Get-Content \\iparraypath)
foreach ($IP in $IP_Array) {
mainreplace
}
function mainreplace {
$path = "\\$IP\path.."
Copy-Item $path path..
$l = (Get-Content $path)
if ($l.StartsWith('oldtext')) {
($l) -replace "oldtext.*",'newtext' | Set-Content $path
}
}
答案 0 :(得分:1)
您要查找的cmdlet是Invoke-Command
。此外,您希望在输入文件的整个内容上运行-replace
,否则将从输出中删除所有不匹配的行。
foreach ($IP in $IP_Array) {
Invoke-Command -Computer $IP -ScriptBlock {
# use local path here, b/c the scriptblock is running on the remote host
$file = 'C:\path\to\your.ini'
(Get-Content $file) -replace 'oldtext.*', 'newtext' |
Set-Content $file
} -Credential $cred
}
不需要复制文件(除非您要保留备份副本),因为将Get-Content
括在括号中(所谓的分组表达式)会在替换之前将整个内容读入内存。这样,您可以将修改后的输出直接写回源文件。