5

いくつかの PowerShell スクリプトがネットワーク共有 A にあり、これらのスクリプトの最新バージョンが読み取り専用ネットワーク共有 B にあります。読み取り専用共有はビルド システムの出力であり、パスにビルド番号があります。スクリプトがディスク上にファイルを作成する必要があるという理由もありますが、主にパスが予測可能であるため、実行する前に PowerShell スクリプトをネットワーク共有 A にコピーします。問題は、スクリプトを常にネットワーク共有 A にコピーするとは限らないことです。そのため、これらのスクリプトが古くなっていることがあります。

ネットワーク共有 A の PowerShell スクリプトを (共有 B から最新バージョンをコピーして) 更新し、それらの最新スクリプトを実行するスクリプトを作成しようとしています。現在、私の考えは、共有 B から最新のスクリプトを取得し、それを共有 A にコピーして、共有 A でそのスクリプトを実行する小さなスクリプトを作成することです。

スクリプト自体を更新することは可能ですか? つまり、2 つのスクリプトを使用する代わりに、新しいバージョン自体を共有 B から共有 A にコピーし、それ自体の実行を再開する 1 つのスクリプト (共有 A にある) を使用できますか? (ファイル作成日に関するいくつかのロジックを入れて、最初の実行時にそれ自体が更新され、2 回目の実行時にスクリプトの実際の肉が実行されるようにします。)

4

2 に答える 2

3

はい、実行中のスクリプトを更新してから、再度実行できます。(更新後、最初のスクリプトを必ず終了してください。) 以下は、私が作成したサンプル コードです。

Write-Host "Starting script"
if ($(Get-Item G:\selfUpdater2.ps1).CreationTimeUtc -gt $(Get-Item G:\selfUpdater.ps1).CreationTimeUtc) {
    Copy-Item G:\selfUpdater2.ps1 G:\selfUpdater.ps1
    $(Get-Item G:\selfUpdater.ps1).CreationTimeUtc = [DateTime]::UtcNow
    &G:\selfUpdater.ps1
    exit
}
Write-Host "Continuing original script; will not get here if we updated."

渡すパラメーターがある場合は、それらをターゲット スクリプトに渡す必要があることに注意してください。更新されたスクリプトには、現在のスクリプトよりも多くの、または少ないパラメーター (現在のスクリプトによってバインドされているものとバインドされていないもの) がある可能性があるため、両方を反復処理し$script:MyInvocation.BoundParameters$script:MyInvocation.UnboundArgumentsそれらすべてを取得して渡す必要があります。

Invoke-Expression ".\scriptName.ps1 $stringOfArguments"(個人的には、 を使用するよりもランダム パラメータ パッシングを使用した方が運が良かったの&.\scriptName.ps1 $argumentsですが、マイレージは異なる場合があります。または、私よりも多くの PowerShell を知っている可能性がありますInvoke-Expression。それらにスペースが含まれています。)

欠点が 1 つあります。スクリプトの将来のバージョンで必須のスクリプト パラメータが削除された場合、スクリプト自体が更新されてパラメータを削除できるようになる前に、必須でなくなったパラメータを使用してスクリプトを少なくとも 1 回実行する必要があります。

于 2013-08-02T23:43:28.780 に答える