Powershell invoke-command $ input - PullRequest
       35

Powershell invoke-command $ input

0 голосов
/ 21 ноября 2018

У меня проблема .. Кто-нибудь может мне помочь?Вот мой код:

$A = '123'
$servers = 'computer1'
$Properties = [ordered]@{A = $A
                          servers = $servers     
                        }

$MyObject = New-Object -TypeName PSObject -Property $Properties

$MyObjec
...

$result = Invoke-Command -ComputerName Machine -UseSSL -InDisconnectedSession -ScriptBlock {
$MyObject.A
$MyObject.servers
$env:computername
}`
–InputObject $MyObjec -port 5986 -ConfigurationName myEndpoint -SessionOption @{OutputBufferingMode="Drop"} -Credential $credential | Receive-PSSession

$result

Вопрос: почему $result ничего не показывает о $MyObject?

Это только показывает $MyObjec (не в команде invoke) и $env:computername (в команде invoke)

Как это исправить?

PS Это действительно то, что я хочу сделать, я хочу попасть на несколько машин, которые в 6разные AD в одно и то же время, но они должны использовать другое имя пользователя, и мне нужно $ A на удаленной машине, чтобы иметь дело с другой вещью.

$A = '123'
    $servers = 'computer1'
    $Properties = [ordered]@{A = $A
                              servers = $servers     
                            }

    $MyObject = New-Object -TypeName PSObject -Property $Properties

    $MyObjec
    ...

#Add
$servers@{'Machine1','Machine2','Machine3'}

Foreach ($servers in $servers) {

Star-Job {

$username = $servers+'account'

$password = $password

$credential = ....($username,$password)

    $result = Invoke-Command -ComputerName $servers -UseSSL -InDisconnectedSession -ScriptBlock {
    $MyObject.A
    $MyObject.servers
    $env:computername
    }`
    –InputObject $MyObjec -port 5986 -ConfigurationName myEndpoint -SessionOption @{OutputBufferingMode="Drop"} -Credential $credential | Receive-PSSession

    $result
}

}

Я попробую -Argument-List и param {}, потому что я пробую Start-Job с -Argument-List и $ Using, там есть ошибка.Спасибо за ваш ответ!

1 Ответ

0 голосов
/ 21 ноября 2018

Поскольку часть в -Scriptblock { ... } выполняется в удаленной системе и, следовательно, не имеет доступа к переменным в локальной системе (другая область).

Это можно изменить, передав переменные в удаленную систему.Система использует параметр -Argument-List, например:

Invoke-Command -ComputerName Machine -ArgumentList $MyObject -ScriptBlock { 
    param($MyObject)

    $MyObject.A
}

Или используйте $using:, чтобы получить доступ к локально определенным переменным, например:

Invoke-Command -ComputerName Machine -ScriptBlock { 

    $using:MyObject.A
}
...