如何在 PowerShell 中通过字符串变量列表中的命令使用运行空间

问题描述 投票:0回答:1

如何从字符串列表中循环命令以在 PowerShell 中使用 RunSpaces。

这是我正在开发的项目的代码。

它适用于普通命令,但我认为它不适用于 [void]$PowerShell.AddScript 部分中的以下命令。 $singlefunction 是一个字符串变量,其中包含带有开关参数的命令,有时如“CleanUp -All”

iex -Command $singlefunction

这是代码

# Loop for runspaces
foreach ($singlefunction in $listoffunctions)
{
    $PowerShell = [PowerShell]::Create() 
    $PowerShell.RunspacePool = $RunspacePool

    [void]$PowerShell.AddScript({       
        iex -Command $singlefunction
    })
    
    ## start runspace asynchronously so that it does not block this loop
    $handle = $PowerShell.BeginInvoke()

    # Create job
    $job = [pscustomobject]@{ 
        PowerShell = $PowerShell
        Handle = $handle
    }

    # Add first runspace to job list
    $jobs.Add( $job )

}
list powershell loops command runspace
1个回答
0
投票

根据猜测,问题的原因是您没有将

$singlefunction
作为参数传递给您的运行空间:

[void] $PowerShell.AddScript({
    # `$singlefunction` does not exist in this context
    Invoke-Expression -Command $singlefunction
})

如果您想将该字符串作为参数传递给

Invoke-Expression
,您可以使用
.AddArgument
.AddParameter
.AddParameters
。例如:

[void] $PowerShell.AddScript({
    Invoke-Expression -Command $args[0]
}).AddArgument($singlefunction)

但是,如果您的目的是执行该字符串中的表达式,则这种方法过于复杂,

.AddScript
需要一个将被计算为表达式的字符串,解决问题可能很简单:

[void] $PowerShell.AddScript($singlefunction)

演示:

using namespace System.Management.Automation.Runspaces

$cleanUpFunc = {
    param([switch] $All, $Foo, $Bar)

    "Called '$($MyInvocation.MyCommand.Name)' with parameters:",
    $PSBoundParameters | Format-Table
}

$iss = [initialsessionstate]::CreateDefault2()
$iss.Commands.Add([SessionStateFunctionEntry]::new(
    'CleanUp', $cleanUpFunc))


$singlefunction = 'CleanUp -All -Foo Hello -Bar World'
$rs = [runspacefactory]::CreateRunspace($iss)
$rs.Open()

$PowerShell = [PowerShell]::Create().
    AddScript($singlefunction)
$PowerShell.Runspace = $rs
$PowerShell.Invoke()

# Outputs:
#
# Called 'CleanUp' with parameters:
#
# Key Value
# --- -----
# All True
# Foo Hello
# Bar World
© www.soinside.com 2019 - 2024. All rights reserved.