我正在尝试使用Invoke-Command -asJob在远程计算机列表上运行带有参数的PS1,并且我有一个让变量工作的bugger。据我所知,远程运行的代码块通常不能使用局部变量,但我发现了许多似乎应该解决问题的解决方案。我从这开始,但它有局部变量。
foreach ($machine in $Machines) {
Invoke-Command -computerName:$machine –scriptblock {
& powershell.exe -executionpolicy bypass -file $filePath -jobsfile $jobsFile
} -credential:$credential -authentication:CredSSP –asJob -jobName:$machine > $null
}
我也尝试使用-argumentList,其中$ arguments包含两个包含变量的参数。 (我还尝试了一种变体,其中-Path是一个文字,而PS1的-jobFile参数只包含在参数中。)
foreach ($machine in $Machines) {
Invoke-Command -computerName:$machine -argumentList:$arguments –scriptblock {
& powershell.exe -executionpolicy bypass
} -credential:$credential -authentication:CredSSP –asJob -jobName:$machine > $null
}
最后我尝试了使用:方法。
foreach ($machine in $Machines) {
Invoke-Command -computerName:$machine –scriptblock {
& powershell.exe -executionpolicy bypass -file $using:filePath -jobsfile $using:jobsFile
} -credential:$credential -authentication:CredSSP –asJob -jobName:$machine > $null
}
到目前为止没有任何作用,所以任何指针都非常受欢迎。
答案 0 :(得分:0)
用于远程PowerShell 如果您在客户端的工作组中以管理员身份运行powershell
Enable-PSRemoting -Force
用于连接的配置信任主机,您应该信任客户端
Set-Item wsman:\localhost\client\trustedhosts *
重置winrm服务
Restart-Service WinRM
现在可以使用
Invoke-Command -ComputerName COMPUTER -ScriptBlock { COMMAND } -credential USERNAME
你应该为winrm配置防火墙 您可以使用此方法运行脚本
$script = {Get-EventLog -LogName System -Newest 10 | where { $_.Index -ge 5071811 } | sort Index}
然后
[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes( $script))
获取编码命令并使用
powershell -encodedcommand **encoded**
使用psremoting输入时可以使用
Enter-PSSession -ComputerName COMPUTER -Credential USER
您的代码:
foreach ($machine in $Machines) {
Invoke-Command -computerName:$machine –scriptblock {
& powershell.exe -executionpolicy bypass -file $using:filePath -jobsfile $using:jobsFile
} -credential:$credential -authentication:CredSSP –asJob -jobName:$machine > $null
}
我的代码:
$s = New-PSSession -ComputerName Server1.Domain44.Corpnet.Fabrikam.com -Credential Domain01\Admin01
Invoke-Command -FilePath c:\scripts\test.ps1 -session $s -Asjob
答案 1 :(得分:0)
所以,工作解决方案是
foreach ($machine in $Machines) {
Invoke-Command -computerName:$machine -argumentList: $filePath, $jobsFile –scriptblock {
param (
[String]$file,
[String]$jobsFile
)
& powershell.exe -executionpolicy bypass -file $file -jobsFile $jobsFile
} -credential:$credential -authentication:CredSSP –asJob -jobName:$machine > $null
}