0

我想知道如何在 Windows 批处理文件或 PowerShell 脚本中执行一组语句或命令,以便只执行一次。即使我多次运行脚本,那组特定的代码或程序也应该只运行一次。

如果可能,请给出批处理文件和 PowerShell 的示例。

4

1 回答 1

3

在这两种情况下,您都需要进行以下更改:(a) 在运行批处理文件或 PowerShell 脚本之后持续存在,并且 (b) 在下次启动时可见。这些变化是什么取决于你想离开系统的混乱程度。

一种选择是环境变量。您可以使用批处理文件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

但是,这种方法有其缺点。例如,它不会阻止您在脚本第一次运行时都存在的不同进程中运行相同的脚本两次。这是因为环境变量是在进程启动时填充的,因此即使是系统范围的更改也只适用于进程,而不适用于那些已经运行的进程。

另一种选择是您检查是否存在的文件。即使在上述环境变量失败的情况下,这也有利于工作。另一方面,文件可能比环境变量更容易被意外删除。

但是,由于我相信您的批处理文件或 PowerShell 脚本应该一些事情,即有副作用,您可能应该完全使用它作为中止的标准。也就是说,如果副作用以某种方式可见。例如,如果您正在更改某些系统设置或创建一堆输出文件等,您可以检查是否已经进行了更改或文件是否已经存在。

一个可能非常安全的选择是在第一次运行结束时删除或重命名批处理文件/PowerShell 脚本。或者至少将扩展名更改为不容易执行的内容。

于 2013-01-28T08:19:00.477 回答