Powershell передает параметры во вложенное начальное задание

Я пытаюсь передать параметры вложенной работе.

$executepath = "D:\nttools\CoreAutomation\$patch.zipfilename\$ntupdatefilename"

$sb = {Start-Job -Name $NTUpdate -ScriptBlock {& cmd.exe /c $executepath}}

Invoke-Command -Session $NTSession -ScriptBlock $sb -ArgumentList $executepath

С этим выводом, показывающим, что команда фактически не отображает параметр в строке:

State          : Running
PSComputerName : LKS.nt.isg.local
RunspaceId     : 8a1c9cc2-1cd0-42a6-a1d0-89d977aabf04
HasMoreData    : True
StatusMessage  :
Location       : localhost
Command        : & cmd.exe /c $executepath
JobStateInfo   : Running
InstanceId     : 9e95c0d8-d177-4a1a-9283-56f07ff5f0a8
Id             : 1
Name           : Job1
ChildJobs      : {System.Management.Automation.PSRemotingChildJob}
PSJobTypeName  : BackgroundJob
PSBeginTime    : 5/9/2017 2:00:49 PM
PSEndTime      :

Я попытался добавить эти параметры в блок сценария с тем же результатом:

$executepath = "D:\nttools\CoreAutomation\$patch.zipfilename\$ntupdatefilename"

$sb = {Start-Job -Name $NTUpdate -ScriptBlock {param($executepath) & cmd.exe /c $executepath} -ArgumentList $executepath}

Invoke-Command -Session $NTSession -ScriptBlock $sb -ArgumentList $executepath


State          : Running
PSComputerName : LKS.nt.isg.local
RunspaceId     : 7e039382-d8a6-4298-9983-8f3f6fd2a6c3
HasMoreData    : True
StatusMessage  :
Location       : localhost
Command        : param($executepath) & cmd.exe /c $executepath
JobStateInfo   : Running
InstanceId     : 77e80c13-2801-4726-81f4-8c960319cd0b
Id             : 1
Name           : Job1
ChildJobs      : {System.Management.Automation.PSRemotingChildJob}
PSJobTypeName  : BackgroundJob
PSBeginTime    : 5/9/2017 2:08:38 PM
PSEndTime      :

Обновлено:

Пробовал то, что было указано в комментариях. Не повезло, тот же результат.

$executepath = "D:\nttools\CoreAutomation\$patch.zipfilename\$ntupdatefilename"

$sb = {param($executepath) Start-Job -Name NTUpdate -ScriptBlock {param($executepath) & cmd.exe /c $executepath} -ArgumentList $executepath}

Invoke-Command -Session $NTSession -ScriptBlock  $sb -ArgumentList $executepath


State          : Running
PSComputerName : LKS.nt.isg.local
RunspaceId     : 7b7b86df-a216-494e-b7e7-2336e6994a06
HasMoreData    : True
StatusMessage  :
Location       : localhost
Command        : param($executepath) & cmd.exe /c $executepath
JobStateInfo   : Running
InstanceId     : 4d5dd307-2158-4b38-b118-987f1e56cb12
Id             : 1
Name           : NTUpdate
ChildJobs      : {System.Management.Automation.PSRemotingChildJob}
PSJobTypeName  : BackgroundJob
PSBeginTime    : 5/9/2017 2:25:19 PM
PSEndTime      :

Обновление 2 – $using:executepath

Invoke-Command -Session $NTSession -ScriptBlock {Start-Job -Name NTUpdate -ScriptBlock {& cmd.exe /c $Using:executepath}}

Я пробовал с, и я получаю эту ошибку:

The value of the using variable '$using:executepath' cannot be retrieved because it has not been set in the local
session.
    + CategoryInfo          : InvalidOperation: (:) [Start-Job], RuntimeException
    + FullyQualifiedErrorId : UsingVariableIsUndefined,Microsoft.PowerShell.Commands.StartJobCommand
    + PSComputerName        : LKSNTADM01.nt.isg.local

person BilliAm    schedule 09.05.2017    source источник
comment
Я считаю, что для Invoke-Command вам нужно ссылаться на аргумент в блоке скрипта как $using:executepath.   -  person Jeff Zeitlin    schedule 09.05.2017
comment
@PetSerAl Пробовал с тем же результатом, что и раньше. Ного.   -  person BilliAm    schedule 09.05.2017
comment
Ну, давайте немного отступим. Вы пытаетесь сослаться на свойство ZipFileName объекта $patch? Или $patch это строка? Вы уверены, что $executepath является допустимой строкой?   -  person TheMadTechnician    schedule 09.05.2017
comment
Объект @TheMadTechnician $patch представляет собой хеш-таблицу. $ntupdatefilename также является строкой. Строка в $executepath правильно отображается за пределами блока скрипта.   -  person BilliAm    schedule 10.05.2017
comment
Также @TheMadTechnician, я вижу, что вы говорите, когда $executepath и $patch являются хеш-таблицами. Это был неправильный путь, НО это все еще не имеет значения в этом случае, поскольку он все равно должен показывать этот искаженный путь в значении свойства команды.   -  person BilliAm    schedule 10.05.2017
comment
@BilliAm Извините, но что вы ожидаете увидеть в свойстве Command, если не команду, которую вы передаете Start-Job?   -  person user4003407    schedule 10.05.2017
comment
Я ожидаю увидеть & cmd.exe /c D:\nttools\CoreAutomation\Defect1126511_CD_2017-04-24_1800_A\nttest_genlog.cmd в команде, так как это то, что установлено в $executepath. Я не могу заставить блоки сценариев принимать параметры и отображать их, как показано.   -  person BilliAm    schedule 10.05.2017
comment
@JeffZeitlin Пытался $using:   -  person BilliAm    schedule 10.05.2017
comment
@BilliAm Ваши ожидания неверны. В свойстве команды вы должны увидеть $executepath, а не значение, которое оно установило.   -  person user4003407    schedule 10.05.2017


Ответы (1)


Итак, если я правильно понимаю, ваша главная проблема здесь в том, что когда вы смотрите на команду в задании, вы видите:

& cmd.exe /c $executepath

Когда вы ожидаете увидеть:

& cmd.exe /c D:\nttools\CoreAutomation\Defect1126511_CD_2017-04-24_1800_A‌​\nttest_genlog.cmd

Блок сценария не будет интерполировать строковую переменную, поэтому, если вы хотите увидеть все это в расширенном виде, вы можете определить блок сценария как строку, а затем преобразовать его в блок сценария.

$sbtext = "Start-Job -Name $NTUpdate -ScriptBlock {& cmd.exe /c $executepath}"
$sb = [scriptblock]::Create($sbtext)

Это должно дать вам желаемые результаты.

person TheMadTechnician    schedule 09.05.2017
comment
Это было оно. Я также удалил &. - person BilliAm; 10.05.2017