splatting 时使用哈希表作为参数?
Use hashtable as parameter when splatting?
我正在尝试使用 Start-Job 启动新的 Powershell 脚本。新脚本有几个参数(有些是可选的,有些不是),所以我想制作一个哈希 table 并将它们展开。但是,这些参数之一本身就是一个散列 table。我正在尝试这样开始工作:
$MyStringParam = "string1"
$MyHashParam = @{}
$MyHashParam.Add("Key1", "hashvalue1")
$arguments = @{MyStringParam=$MyStringParam;MyHashParam=$MyHashParam}
Start-Job -Name "MyJob" -ScriptBlock ([scriptblock]::create("C:\myscript.ps1 $(&{$args} @arguments)"))
于是我在新工作中得到这个错误:
Cannot process argument transformation on parameter 'arguments'.
Cannot convert the "System.Collections.Hashtable" value of
type "System.String" to type "System.Collections.Hashtable".
看起来它正在将我想作为散列传入的值 table 视为字符串。对于我的生活,我无法弄清楚如何解决这个问题。有人可以帮忙吗?
而不是
[scriptblock]::create("C:\myscript.ps1 $(&{$args} @arguments)")
这个有用吗?
[scriptblock]::create("C:\myscript.ps1 $(&{$args}) @arguments")
即将 splat 移到 $()
之外
您需要将变量作为脚本块的参数传递到脚本块中,然后将该参数传递给您的第二个脚本。像这样的东西应该适合你:
Start-Job -Name "MyJob" -ScriptBlock {Param($PassedArgs);& "C:\myscript.ps1" @PassedArgs} -ArgumentList $Arguments
我创建了以下脚本并将其保存到 C:\Temp\TestScript.ps1
Param(
[String]$InString,
[HashTable]$InHash
)
ForEach($Key in $InHash.keys){
[pscustomobject]@{'String'=$InString;'HashKey'=$Key;'HashValue'=$InHash[$Key]}
}
然后我运行以下内容:
$MyString = "Hello World"
$MyHash = @{}
$MyHash.Add("Green","Apple")
$MyHash.Add("Yellow","Banana")
$MyHash.Add("Purple","Grapes")
$Arguments = @{'InString'=$MyString;'InHash'=$MyHash}
$MyJob = Start-Job -scriptblock {Param($MyArgs);& "C:\Temp\testscript.ps1" @MyArgs} -Name "MyJob" -ArgumentList $Arguments | Wait-Job | Receive-Job
Remove-Job -Name 'MyJob'
$MyJob | Select * -ExcludeProperty RunspaceId | Format-Table
它产生了预期的结果:
String HashKey HashValue
------ ------- ---------
Hello World Yellow Banana
Hello World Green Apple
Hello World Purple Grapes
运行 作业的进程将向返回的任何对象添加一个 RunspaceId 属性,这就是我不得不排除它的原因。
我正在尝试使用 Start-Job 启动新的 Powershell 脚本。新脚本有几个参数(有些是可选的,有些不是),所以我想制作一个哈希 table 并将它们展开。但是,这些参数之一本身就是一个散列 table。我正在尝试这样开始工作:
$MyStringParam = "string1"
$MyHashParam = @{}
$MyHashParam.Add("Key1", "hashvalue1")
$arguments = @{MyStringParam=$MyStringParam;MyHashParam=$MyHashParam}
Start-Job -Name "MyJob" -ScriptBlock ([scriptblock]::create("C:\myscript.ps1 $(&{$args} @arguments)"))
于是我在新工作中得到这个错误:
Cannot process argument transformation on parameter 'arguments'.
Cannot convert the "System.Collections.Hashtable" value of
type "System.String" to type "System.Collections.Hashtable".
看起来它正在将我想作为散列传入的值 table 视为字符串。对于我的生活,我无法弄清楚如何解决这个问题。有人可以帮忙吗?
而不是
[scriptblock]::create("C:\myscript.ps1 $(&{$args} @arguments)")
这个有用吗?
[scriptblock]::create("C:\myscript.ps1 $(&{$args}) @arguments")
即将 splat 移到 $()
您需要将变量作为脚本块的参数传递到脚本块中,然后将该参数传递给您的第二个脚本。像这样的东西应该适合你:
Start-Job -Name "MyJob" -ScriptBlock {Param($PassedArgs);& "C:\myscript.ps1" @PassedArgs} -ArgumentList $Arguments
我创建了以下脚本并将其保存到 C:\Temp\TestScript.ps1
Param(
[String]$InString,
[HashTable]$InHash
)
ForEach($Key in $InHash.keys){
[pscustomobject]@{'String'=$InString;'HashKey'=$Key;'HashValue'=$InHash[$Key]}
}
然后我运行以下内容:
$MyString = "Hello World"
$MyHash = @{}
$MyHash.Add("Green","Apple")
$MyHash.Add("Yellow","Banana")
$MyHash.Add("Purple","Grapes")
$Arguments = @{'InString'=$MyString;'InHash'=$MyHash}
$MyJob = Start-Job -scriptblock {Param($MyArgs);& "C:\Temp\testscript.ps1" @MyArgs} -Name "MyJob" -ArgumentList $Arguments | Wait-Job | Receive-Job
Remove-Job -Name 'MyJob'
$MyJob | Select * -ExcludeProperty RunspaceId | Format-Table
它产生了预期的结果:
String HashKey HashValue
------ ------- ---------
Hello World Yellow Banana
Hello World Green Apple
Hello World Purple Grapes
运行 作业的进程将向返回的任何对象添加一个 RunspaceId 属性,这就是我不得不排除它的原因。