1

Я пытаюсь выполнить следующий скрипт PowerShell с сервера-2 с сервера-1 (т.е. удаленном сервере):Как передать локальную переменную Invoke-Command -scriptblock в

$DBServer = 'Server1' 

Invoke-Command -ComputerName $DBServer -ScriptBlock { 
$status = Start-Process "C:\Program Files\iQ4bis\HaloSource\HaloSource.Run.exe" '"D:\Test\UsageTracking.iqp" /wf "Default Workflow" /e "Dev" ' -Wait -PassThru 
$test2 = $status.ExitCode 
if ($test2 -ne 0) 
{ 
    Throw "The command exited with error code: $test2" 
} 
else 
{ 
    Write-host "Workflow executed successfully."  
} 
} 

Вопрос: Код часть

"C:\Program Files\iQ4bis\HaloSource\HaloSource.Run.exe" '"D:\Test\UsageTracking.iqp" /wf "Default Workflow" /e "Dev" ' -Wait -PassThru 

Я хотел сделать это параметризованным, так как значения для D:\Test\UsageTracking.iqp и Dev собираются изменить для каждого проекта. Как передать новые значения с помощью параметра? Это, как я хотел, если это возможно:

clear-host 

$DBServer = 'Server1' 
$v1 = 'D:\Test\UsageTracking.iqp' 
$v2 = 'Dev' 
$v3 = "C:\Program Files\iQ4bis\HaloSource\HaloSource.Run.exe" 

Invoke-Command -ComputerName $DBServer -ScriptBlock { 
param(
[string] $IQPFileDestinationLocation = $v1, [string] $ExecutionEnvironment = $v2, [string] $exe = $v3 
) 

$IQPFileLocation = $IQPFileDestinationLocation 
$workflow = "Default Workflow" 
$environment = $ExecutionEnvironment 
$test = """$exe"" '""$IQPFileLocation"" /wf ""$workflow"" /e ""$environment""'" 
$test 

$status = Start-Process $test -Wait -PassThru 

$test2 = $status.ExitCode 
if ($test2 -ne 0) 
{ 
    Throw "The command exited with error code: $test2" 
} 
else 
{ 
    Write-host "It went ok."  
} 

} -ArgumentList $v1 ,$v2 ,$v3 

Когда я бегу выше, я получаю следующее сообщение об ошибке:

This command cannot be run due to the error: The system cannot find the file specified. 
    + CategoryInfo   : InvalidOperation: (:) [Start-Process], InvalidOperationException 
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand 
    + PSComputerName  : ken-dev-bi001 

The command exited with error code: 
At line:8 char:1 
+ Invoke-Command -ComputerName $DBServer -ScriptBlock { 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : OperationStopped: (The command exited with error code: :String) [], RuntimeException 
    + FullyQualifiedErrorId : The command exited with error code: 

любая помощь будет appriciated, чтобы получить его работу.

ответ

0

Все,
Итак, наконец-то я понял это, как передать локальную переменную -ScriptBlock при использовании с Invoke-Command против удаленного сервера.

Вот код, который я использовал, и он работал как шарм:

Write-Host "Workflow command was: "$HaloSourceCommandLine 

Invoke-Command -ComputerName $DBServer -ScriptBlock { 
param ([string] $t1 = $HaloSourceCommandLine, [string] $t2 = $HaloSourceExecutableLocation) 

    $status = Start-Process $t2 $t1 -Wait -PassThru 
    $ExitCodeInfo = $status.ExitCode 
     if ($ExitCodeInfo -ne 0) 
     { 
      Throw "The command exited with error code: $test2" 
     } 
     else 
     { 
      Write-host "Workflow executed successfully."  
     } 
} -ArgumentList $HaloSourceCommandLine,$HaloSourceExecutableLocation 

Надеется, это поможет другим, если они возникли проблемы выполняющихся -ScriptBlock с удаленным сервером через Invoke-Command

Спасибо, HP

0

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

Предположим, вам необходимо создать веб-сайт, размещенный в IIS. Я объявил переменные. В функции u можно присваивать значения переменным as, она должна была быть такой, а не $ args [0], , она должна была быть $ abc, но я назначил значение переменной runtime. U также может назначить несколько значений, разделяя ее с запятой, как

-scriptblock {Start-сайта $ арг [0] $ арг [1]} -ArgumentList $ хуг, $ аЬс

Code Snippet 

    $User="UserName" 
    $Password="password" 
    $abc="MyWebsite" 
    $xyz="MyWebsite2" 
    $ComputerName = "MyComputerName" 
    $pword = ConvertTo-SecureString -String $Password -AsPlainText -Force 
    $credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User, $pword 

    function StartIIS($abc) 
    { 
    Invoke-Command -ComputerName $ComputerName -Credential $credential -ScriptBlock {Start-Website $args[0]} ArgumentList $abc 
    } 

    StartIIS($abc) 
Смежные вопросы