2015-04-29 3 views
3

Я пытаюсь использовать Start-Job для запуска нового сценария Powershell. Новый скрипт имеет несколько параметров (некоторые необязательные, некоторые - нет), поэтому я хочу сделать хэш-таблицу и использовать ее. Однако один из этих параметров сам по себе является хэш-таблицей. Я пытаюсь начать работу, как это:Использовать hashtable в качестве параметра при splatting?

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

Похоже, это лечение значение я хочу передать в качестве хэш-таблицы как строка. Для жизни я не могу понять, как обойти это. Может ли кто-нибудь помочь?

ответ

1

Вам нужно будет передать переменную в скриптблоке в качестве параметра scriptblock, а затем передать этот параметр второму сценарию. Нечто подобное должно работать для вас:

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 к любым возвращаемым объектам, поэтому я должен был исключить это.

+0

спасибо. Это отличное решение и работало на меня. – DataBeast

1

Вместо

[scriptblock]::create("C:\myscript.ps1 $(&{$args} @arguments)") 

делает эту работу?

[scriptblock]::create("C:\myscript.ps1 $(&{$args}) @arguments") 

I.e. переместите знак за пределами $()

Смежные вопросы