如何将局部变量传递给 Invoke-Command 的 -ScriptBlock



我正在尝试从Server-2对Server-1(即远程服务器)执行以下PowerShell脚本:

$DBServer = 'Server1' 
Invoke-Command -ComputerName $DBServer -ScriptBlock {
$status = Start-Process "C:Program FilesiQ4bisHaloSourceHaloSource.Run.exe" '"D:TestUsageTracking.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 FilesiQ4bisHaloSourceHaloSource.Run.exe" '"D:TestUsageTracking.iqp" /wf "Default Workflow" /e "Dev" ' -Wait -PassThru

我想让它参数化,因为D:TestUsageTracking.iqpDev的值会随着项目的变化而变化。如何使用参数传入新值?如果可能的话,这就是我想要的方式:

clear-host
$DBServer = 'Server1'
$v1 = 'D:TestUsageTracking.iqp'
$v2 = 'Dev'
$v3 = "C:Program FilesiQ4bisHaloSourceHaloSource.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: 

任何帮助都会被告知以使其发挥作用。

我不会实现您的代码,但会通过一个简单的示例进行解释,以便您可以相应地实现它。

假设您需要启动一个托管在IIS上的网站。我已经声明了变量。在函数u中,可以将值分配给变量,因为它应该是这样的,而不是$args[0],它应该是$abc,但我已经分配了变量runtime的值。u也可以通过用逗号分隔来分配多个值,比如

-ScriptBlock{启动网站$args[0]$args[1]}-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)

全部,
所以,最后我发现了如何将本地变量传递给-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

如果其他人在通过Invoke-Command 对远程服务器执行-ScriptBlock时遇到问题,希望这将对他们有所帮助

谢谢,HP

回复了一篇非常旧的帖子,但这是一个热门搜索结果,所以我认为更新是合适的。

在PowerShell 3.0+中实现这一点的非常简单的方法是使用";使用";要传递到-ScriptBlock中的远程计算机的任何本地变量的作用域。下面的示例代码在本地"$UpdateFilePath";变量

$SoftwarePackage = [code to find current software exe file]
$UpdateFilePath = "C:Install$SoftwarePackage" 
   
Invoke-Command -ComputerName $RemoteComputerName -ScriptBlock {New-ItemProperty -Path HKLM:SoftwareMicrosoftWindowsCurrentVersionRunOnce -Name "UpdateSoftware" -Type String -Value $Using:UpdateFilePath}

在远程计算机上运行的命令中包括本地变量

相关内容

  • 没有找到相关文章

最新更新