我正在编写一个简单的 PS 脚本来启动或停止我在 Azure 中托管的所有 VM。依次执行此操作需要很长时间,因此我将其设置为一个作业(即 VM 的每个启动/停止都是一个单独的作业)。
现在脚本执行得更快,因为每个启动/停止操作都独立于另一个,但是如果我关闭 PS shell 窗口,作业显然会停止并且该操作不会在 VM 上执行。我想要的是某种“一劳永逸”的动作,我可以在其中运行脚本,看到它已经开始执行作业,然后关闭我的笔记本电脑并打包。
即使PS窗口已关闭,这是否可以在PS中开始工作?
谢谢
我正在编写一个简单的 PS 脚本来启动或停止我在 Azure 中托管的所有 VM。依次执行此操作需要很长时间,因此我将其设置为一个作业(即 VM 的每个启动/停止都是一个单独的作业)。
现在脚本执行得更快,因为每个启动/停止操作都独立于另一个,但是如果我关闭 PS shell 窗口,作业显然会停止并且该操作不会在 VM 上执行。我想要的是某种“一劳永逸”的动作,我可以在其中运行脚本,看到它已经开始执行作业,然后关闭我的笔记本电脑并打包。
即使PS窗口已关闭,这是否可以在PS中开始工作?
谢谢
以下脚本在远程计算机上作为作业执行,在此示例中,它将时间写入远程计算机上的文件。
启动脚本后,我关闭本地 powershell 会话,脚本继续在远程计算机上执行,表明您需要的确实是可能的。
$computername = "mycomputer"
$script = {
1..10 | %{
"$_ $(get-date)" | out-file -FilePath "c:\temp\time.txt" -Append
sleep 10
}
}
Invoke-Command -ComputerName $computername -ScriptBlock $script -AsJob
如果您将希望在远程计算机中执行的代码放在脚本块中,那么它将在远程计算机上运行,而无需保持本地会话处于活动状态。
如果要在主进程完成后保持作业运行,只需调用新的 powershell 进程即可。像这样的东西
Start-Process -FilePath 'powershell.exe' -ArgumentList '-command "& {gci c:\ -rec}"'
如果需要,您可以使用 -file 命令行参数并指定将在单独进程中执行的 ps1。
只是遇到同样的问题,在脚本末尾添加一个循环..
do{ Start-Sleep 60 } until ((get-job).State -notcontains 'running')
它可能对每个人都没有帮助,但我发现try {} finally {}即使在窗口关闭后,放入作业也可以让您在 finally 块中运行代码。
对于我的场景,我在后台作业中删除了一个文件夹,因此很容易拿起删除并在 finally 块中继续它。
就像是:
Start-Job -ScriptBlock {
$Directory = "c:\temp"
try
{
del $Directory
}
finally
{
# If the window was closed, continue deleting here
if (Test-Path $Directory)
{
del $Directory
}
}
}