Ich arbeite mit einem Skript, das in eine Reihe von Servern funkt und Befehle aus einer Reihe von PoSh-Funktionen ausführt. Ich muss die synchrone Verarbeitung beibehalten und möchte einfach die Möglichkeit hinzufügen, eine asynchrone Operation für die Funktion auszuführen.Arbeiten mit Invoke-Command/Start-Job und PSRemoting
Wie kann ich dies so transformieren, dass es als Job von einer primären Funktion mit Start-Job
oder Invoke-Command -AsJob
aufgerufen wird? Diese Funktionen sind Teil eines PowerShell-Moduls, wenn dies einen Unterschied macht.
Ich habe ein paar verschiedene Beispiele ausprobiert, die ich hier gesehen habe, aber sie scheinen die Funktion nicht wirklich zu verarbeiten.
Zum Beispiel für die unten Funktion habe ich versucht:
foreach($s in $servers)
{
if($lbFileLocation -eq $true)
{
#Rename-LoadBalancerFile -ServerName $server -Revert $false -filePath $filePath -cred $cred - #sync function works great
Start-Job -Name 'RenLb' -InitializationScript {Import-Module '.\Down.psm1'} $ScriptBlock -ArgumentList $server,$false,$lbFileLocation,$Cred | Out-Null
}
}
Write-Host 'Waiting for LB rename.'
While (Get-Job -Name 'RenLb' | where { $_.State -eq 'Running' })
{
Start-Sleep 1
}
Write-Host 'completed'
Original-Synchronfunktion:
function Rename-LoadBalancerFile
{
param
(
[string]
[Parameter(Mandatory=$true)]
$ServerName,
[bool]
[Parameter(Mandatory=$true)]
$Revert,
[string]
[Parameter(Mandatory=$true)]
$filePath,
[PSCredential]
[Parameter(Mandatory=$false)]
$cred
)
$scriptBlock = {
param
(
[bool]
[Parameter(Mandatory=$true)]
$Revert,
[string]
[Parameter(Mandatory=$true)]
$filePath
)
if(Test-Path $filePath -eq $true)
{
Write-Host 'file tested true'
if($Revert -eq $true)
{
$fileName = [IO.Path]::GetFileName($filePath)
$directory = [IO.Path]::GetDirectoryName($filePath)
Rename-Item -Path "$directory\file.txt" -NewName $fileName
}
else
{
Rename-Item -Path $filePath -NewName 'file.txt'
}
}
}
$session = New-PSSession -ComputerName $ServerName -Authentication Credssp -Credential $cred
Invoke-Command -Session $session -ScriptBlock $scriptBlock -ArgumentList $Revert, $filePath
Remove-PSSession $session
}
Kann es nicht atm testen. aber ich denke, Sie sollten 'new-session',' invoke-command' und 'remove-session' mit' Invoke-Command -ScriptBlock {} -ArgumentList $ Revert, $ filePath -ComputerName $ ServerName -Authentication Credssp - ersetzen können. Credential $ cred' –
Für innerhalb der Funktion? Wenn es die Sitzung automatisch öffnet/schließt, sollte das in Ordnung sein. Aber wird das tatsächlich das Problem lösen, das ich erlebe? –
Es löst das Problem nicht. Deshalb ist es ein Kommentar. :-) nur ein Tipp –