1

Ich versuche folgenden Powershell-Skript aus dem Server-2 gegen Server-1 (dh Remote-Server) auszuführen:Wie -ScriptBlock lokale Variable an Invoke-Command passieren

$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."  
} 
} 

Frage: Code Teil

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

Ich wollte es parametrisieren, da sich die Werte für D:\Test\UsageTracking.iqp und Dev pro Projekt ändern werden. Wie kann ich neue Werte über Parameter übergeben? Dies ist das, wie ich es wollte, wenn möglich:

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 

Als ich oben laufen, bekomme ich folgende Fehlermeldung:

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: 

jede Hilfe zu bekommen appriciated daran zu arbeiten.

Antwort

0

Alle,
So, endlich habe ich es heraus, wie lokale Variable -ScriptBlock passieren, während sie mit dem Invoke-Command gegen den Remote-Server verwenden. Hier

ist der Code, den ich verwendet, und es funktionierte wie ein Zauber:

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 

Hoffentlich, anderen zu helfen, wenn sie Problem haben -ScriptBlock gegen remoten Server über Invoke-Command

Dank der Ausführung HP

0

Ich werde Ihren Code nicht implementieren, sondern anhand eines einfachen Beispiels erklären, damit Sie es entsprechend implementieren können.

Angenommen, Sie müssen eine auf IIS gehostete Website starten. Ich habe die Variablen deklariert. In der Funktion, die Sie Variablen Werte zuweisen können, sollte es so gewesen sein, anstelle von $ args [0], hätte es $ abc sein sollen, aber ich habe den Wert der Variablenlaufzeit zugewiesen. u können auch mehrere Werte zuweisen, indem sie mit einem Komma, wie

-ScriptBlock {Start-Webseite $ args [0] $ args [1]} Trennung -ArgumentList $ xyz, $ abc

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)