我试图在PowerShell中限制同一脚本的多次执行。我试过下面的代码。现在它可以工作了,但是一个主要缺点是,当我关闭PowerShell窗口并再次尝试运行相同的脚本时,它将再次执行。
代码:
$history = Get-History
Write-Host "history=" $history.Length
if ($history.Length -gt 0) {
Write-Host "this script already run using History"
return
} else {
Write-Host "First time using history"
}
如何避免这种缺点?
答案 0 :(得分:1)
我假设您要确保脚本不是从不同的Powershell进程运行的,而不是与某种自调用相同的脚本。
无论哪种情况,powershell中都没有此功能,因此您需要模仿一个信号量。
对于同一过程,您可以利用全局变量并将脚本包裹在try / finally块中
$variableName="Something unique"
try
{
if(Get-Variable -Name $variableName -Scope Global -ErrorAction SilentlyContinue)
{
Write-Warning "Script is already executing"
return
}
else
{
Set-Variable -Name $variableName -Value 1 -Scope Global
}
# The rest of the script
}
finally
{
Remove-Variable -Name $variableName -ErrorAction SilentlyContinue
}
现在,如果要执行相同的操作,则需要在过程之外存储某些内容。使用Test-Path
,New-Item
和Remove-Item
,以类似的思路创建文件是一个好主意。
无论哪种情况,请注意,这种模仿信号量的技巧并不像实际信号量那样严格,并且会泄漏。