Удаленный PowerShell на сервере говорит, что аргумент для параметра является пустой строкой - PullRequest
0 голосов
/ 05 июля 2018

У меня есть сценарий powershell на компьютере A, который использует PSSession для вызова команды на компьютере B. На компьютере B есть сценарий powershell, который принимает 4 параметра. Когда я вызываю этот сценарий с 4 аргументами в качестве переменных (которыми они ДОЛЖНЫ быть), они передаются как пустые строки / null. Когда я передаю их как строки (например, -Argument1 "Hello"), эта строка будет передаваться как «Hello», а не как NULL / пустая строка.

Может кто-нибудь сказать мне, почему они не прошли правильно и как это исправить?

Версия powershell на клиенте - 5.1.17134.112. Удаленный компьютер использует 5.1.14393.2248. Эти версии были получены путем запуска $PSVersionTable.PSVersion.

Клиент использует Windows 10 Pro 10.0.17134. Сервер использует Windows 2016 Datacenter 10.0.14393 и работает как виртуальная машина в Azure.

Я пытался использовать Script.ps1 -Argument1 $ClientArgument1 -Argument2 $ClientArgument2 ... для передачи переменных И чтобы использовать ArgumentList для передачи значений через запятую, разделенных в сценарии, но обе эти попытки привели к тому, что вещи не были напечатаны.

Я заметил, что когда я использую -Argument1 "Hello" -Argument2 $ClientArgument2 -Argument3 $ClientArgument3 -Argument4 $ClientArgument4, Hello печатается.

код

Клиент, который подключается к удаленному компьютеру

$ErrorActionPreference = "Stop"

#Create credentials to log in
$URL = 'https://url.to.server:5986'
$Username = "username"
$pass = ConvertTo-SecureString -AsPlainText 'password' -Force
$SecureString = $pass
$MySecureCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$SecureString

$ClientArgument1 = "Argument 1"
$ClientArgument2 = "Argument 2" 
$ClientArgument3 = "Argument 3" 
$ClientArgument4 = "Argument 4" 

#Create the remote PS session
$sessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$session = New-PSSession -ConnectionUri $URL -Credential $MySecureCreds -SessionOption $sessionOption

#Call the remote script and pass variables
Invoke-Command -Session $session -Command {C:\Path\To\Script\On\Remote\Machine\Script.ps1 -Argument1 $ClientArgument1 -Argument2 $ClientArgument2 -Argument3 $ClientArgument3 -Argument4 $ClientArgument4}

#Note: Command is used because Command allows me to execute a script that is located on disk of the remote machine

вызываемый скрипт удаленного компьютера

param(
    [String]$Argument1,
    [String]$Argument2,
    [String]$Argument3,
    [String]$Argument4
)

Write-Host 'Results of the 4 parameters passed into this script:'

Write-Host $Argument1
Write-Host $Argument2
Write-Host $Argument3
Write-Host $Argument4

Write-Host "The results have been printed" 

Ожидаемые и фактические результаты

Ожидаемые результаты:

Results of the 4 parameters passed into this script:
Argument 1
Argument 2
Argument 3
Argument 4
The results have been printed 

Фактические результаты

Results of the 4 parameters passed into this script:




The results have been printed

Большое спасибо за потраченное время!

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Поскольку внутри скриптового блока находится область, отличная от остальной части вашего скрипта, переменные $ClientArgument не определены внутри скриптового блока. Самым простым решением, если вы используете PowerShell 3 или новее, является использование области действия $using:. В противном случае потребуется список аргументов для Invoke-Command.

Invoke-Command -Session $session -Command {C:\Path\To\Script\On\Remote\Machine\Script.ps1 -Argument1 $using:ClientArgument1 -Argument2 $using:ClientArgument2 -Argument3 $using:ClientArgument3 -Argument4 $using:ClientArgument4}
0 голосов
/ 05 июля 2018

Попробуйте выполнить это так:

Invoke-Command -Session $session -Command {

C:\Path\To\Script\On\Remote\Machine\Script.ps1 `
-Argument1 $args[0] -Argument2 $args[1] `
-Argument3 $args[2] -Argument4 $args[3]

} -ArgumentList $ClientArgument1,$ClientArgument2,$ClientArgument3,$ClientArgument4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...