我如何只在batch / powershell中执行一次语句?

时间:2013-01-28 08:09:01

标签: windows powershell batch-file

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

如果可能,请为批处理文件和PowerShell提供示例。

1 个答案:

答案 0 :(得分:3)

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

一个选项是环境变量。您可以使用setx或使用[Environment]::SetEnvironmentVariable的PowerShell设置批处理文件。您还应该正常设置它们以使它们在当前会话中,只是为了确保它也不能再次从该会话中调用。

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

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

另一个选项是您检查存在的文件。即使在上面概述的环境变量失败的情况下,这也有好处。另一方面,文件可能比环境变量更容易被删除。

但是,由于我认为你的批处理文件或PowerShell脚本应该某些东西,即有副作用,你应该使用它作为你的中止标准。也就是说,如果副作用以某种方式可见。例如。如果您要更改某些系统设置或创建一堆输出文件等,您只需检查是否已进行更改或文件是否已存在。

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