私は、一連のサーバにリモート操作し、一連のPoSh関数からコマンドを実行するスクリプトを扱っています。私は同期処理を保持する必要があり、単純にその関数に対して非同期操作を実行する機能を追加したいと考えています。Invoke-Command/Start-JobとPSRemotingを使って作業する
Start-Job
またはInvoke-Command -AsJob
を使用して、これを主機能からジョブとして呼び出すにはどうすれば変換できますか?これらの機能は、違いがある場合、PowerShellモジュールの一部です。
ここで見たさまざまな例をいくつか試しましたが、実際にはその機能を処理していないようです。
は、例えば、以下の機能のために、私が試してみた:
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'
オリジナル、同期機能:
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
}
atmをテストできません。しかし、私は 'new-session'、' invoke-command'、 'remove-session'を' Invoke-Command-ScriptBlock {} -ArgumentList $ Revert、$ filePath -ComputerName $ ServerName -Authentication Credsspで置き換えることができるはずです。資格$ cred' –
関数内では?自動的にセッションを開いたり閉じたりすると、うまくいくはずです。しかし、実際に私が経験している問題を解決するだろうか? –
問題は解決しません。だからそれはコメントです。 :-)ちょうどチップ –