2017-01-20 4 views
0
# Select Template and add ID for easy selection 
$templates = Get-Folder Templates01 | 
      Get-Template | 
      Select name | 
      % {$counter = -1} { 
       $counter++; 
       $_ | Add-Member -Name Template_ID -Value $counter -MemberType NoteProperty -PassThru 
      } 

$templates | ft -Auto 
$MyTemplate = Read-Host "select VM Template_ID" 
$VMTemplate = $templates[$MyTemplate] 

$VMNAME = Read-Host "Specify VM Name" 

New-Vm -Name $VMNAME -Template $vmtemplate.Name 

Das obige Skript funktioniert großartig. Ich möchte jetzt Start-Job verwenden, um es im Hintergrund laufen zu lassen, so dass ich es geändert zu:Wie übergeben Sie Variablen an Start-Job?

# Select Template and add ID for easy selection 
$templates = Get-Folder Templates01 | 
      Get-Template | 
      Select name | 
      % {$counter = -1} { 
       $counter++; 
       $_ | Add-Member -Name Template_ID -Value $counter -MemberType NoteProperty -PassThru 
      } 

$templates | ft -Auto 
$MyTemplate = Read-Host "select VM Template_ID" 
$VMTemplate = $templates[$MyTemplate] 

$VMNAME = Read-Host "Specify VM Name" 

$scriptblock = { 
    Param($1, $2) 
    New-Vm -Name $1 -Template $2 
} 

Start-Job -ScriptBlock $scriptblock -ArgumentList $vmname $vmtemplate.Name 

und ich bekomme diese Fehlermeldung:

Start-Job : Cannot bind parameter 'InitializationScript'. Cannot 
convert the "template01" value of type "System.String" to type 
"System.Management.Automation.ScriptBlock". 
At line:1 char:59 
+ ... -Job -ScriptBlock $scriptblock -ArgumentList $vmname $vmtemplate.Name 
+               ~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Start-Job], ParameterBindingException 
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.StartJobCommand

Wie kann ich das Problem lösen?

+1

Haben Sie versucht, die Argumente als Array übergeben, wie dieser -ArgumentList @ ($ vmname, $ vmtemplate.name) –

+0

yep, das gleiche Resultat – Paul

+0

@ Paul Das ist eindeutig nicht möglich. –

Antwort

3

prüfen diese, ich weiß, dass Sie Code ein wenig ändern müssen :)

Start-Job -ScriptBlock {Get-ChildItem $args[0],$args[1] } -ArgumentList $a,$b 
+0

habe das schon versucht aber den gleichen Fehler bekommen (Parameter kann nicht gebunden werden ....) – Paul

+0

@Paul Wie ich schon sagte: Es ist nicht möglich, dass du die selbe Fehlermeldung von dieser Aussage bekommst. '-ArgumentList' mit einer durch Kommas getrennten Liste von Werten ist, wie Sie eine Liste von Argumenten in einen Skriptblock übergeben. –

0

Dies ist, wie Sie einen Wert innerhalb Start-Job passieren kann.

Sie müssen es von innen aufrufen. Das ist mein Blog-Link für das gleiche: Start-Job Passing value

$ini='$var="'+$args[0]+'"' 
$a={ 
Function Get-add() 
     { 
     "this is the value of $var" 

     } 
} 
start-job -InitializationScript $a -ScriptBlock {param($ini)iex $ini;get-add } -ArgumentList $ini |Wait-Job | Receive-Job 
Verwandte Themen