Invoke-Command -asJob包含变量

时间:2015-03-22 16:12:03

标签: variables powershell remoting

我正在尝试使用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
}

到目前为止没有任何作用,所以任何指针都非常受欢迎。

2 个答案:

答案 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
}