0

Windows バッチ ファイルまたは PowerShell スクリプト内の一連のステートメントまたはコマンドを1 回だけ実行する方法を知りたいです。スクリプトを複数回実行しても、その特定のコードまたはプログラムのセットは 1 回だけ実行する必要があります。

可能であれば、バッチ ファイルと PowerShell の両方の例を挙げてください。

4

1 に答える 1

3

どちらの場合も、(a) バッチ ファイルまたは PowerShell スクリプトを実行した後も持続し、(b) 次回起動したときに表示されるように変更を加える必要があります。それらの変更が何であるかは、システムをどれだけ混乱させたいかによって異なります.

1 つのオプションは、環境変数です。を使用してバッチ ファイルから、setxまたは を使用して PowerShellから設定できます[Environment]::SetEnvironmentVariable。また、そのセッションから再度呼び出すことができないようにするために、現在のセッションでそれらを使用するように通常どおりに設定する必要があります。

if defined AlreadyRun (
  echo This script ran already
  goto :eof
)
...
setx AlreadyRun 1
set AlreadyRun 1

また

if (Test-Path Env:\AlreadyRun) {
  Write-Host This script ran already
  exit
}
...
[Environment]::SetEnvironmentVariable('AlreadyRun', '1', [EnvironmentVariableTarget]::User)
'1' > Env:\AlreadyRun

ただし、このアプローチには欠点があります。たとえば、スクリプトが最初に実行されたときに両方とも存在していた異なるプロセスで、同じスクリプトを 2 回実行することはできません。これは、プロセスの起動時に環境変数が読み込まれるため、システム全体の変更も新しいプロセスにのみ適用され、既に実行されているプロセスには適用されないためです。

別のオプションは、存在を確認するファイルです。これには、環境変数で失敗する上記のシナリオでも機能するという利点があります。一方、ファイルは、環境変数よりも簡単に誤って削除される可能性があります。

ただし、バッチ ファイルまたは PowerShell スクリプトが何かを行う必要がある、つまり副作用があると思われるため、中止の基準として正確に使用する必要があります。つまり、何らかの形で副作用が見られる場合です。たとえば、システム設定を変更したり、多数の出力ファイルを作成したりする場合、変更が既に行われているかどうか、またはファイルが既に存在するかどうかを確認できます。

おそらく非常に安全なオプションは、最初の実行の最後にバッチ ファイルまたは PowerShell スクリプトを削除するか名前を変更することです。または、少なくとも拡張子を簡単に実行されないものに変更してください。

于 2013-01-28T08:19:00.477 に答える