如何使用powershell在Azure VM内运行长时间运行的.CMD文件作为后台作业



我已经使用自定义脚本扩展将一个文件夹从容器复制到订阅中的所有azure vm。我在这个文件夹里有一个.cmd文件,我需要在订阅中的每个vm上运行它。.cmd文件是一个长时间运行的命令,它永远不会结束。我需要在后台运行它。我试过调用命令、启动进程、调用表达式、调用azvmruncommand-asjob等,但实际上并没有触发.cmd文件。我可以通过登录vm或直接从runcommand运行它来运行它,但我想在后台运行它。我也尝试过设置计划任务,但没有用。有什么方法可以更有效地做到这一点吗。?

不能直接传递ScriptBlock中的变量。使用'-ArgumentList'参数或'Using'变量。这适用于启动作业、调用命令等。

由于$path的值将始终为null,因此此ScriptBlock将无法正确执行:

Start-Job -ScriptBlock { set-location $path ; &filename.cmd }

当这些命令起作用时:

# With '-ArgumentList' parameter
Start-Job -ScriptBlock { Set-Location $args[0] ; &.filename.cmd } -ArgumentList $path
# With 'Using' variable
Start-Job -ScriptBlock { Set-Location $Using:path ; &.filename.cmd }

请注意,最新版本的Powershell添加了一个参数,以便能够指定启动作业和调用命令cmdlet的工作目录(-WorkingDirectory(

在测试过程中,我注意到一些问题,这些问题很可能与在作业中使用"设置位置"命令有关。在没有太多细节的情况下,我发现以这种方式运行它更可靠:

# With '-ArgumentList' parameter
Start-Job -ScriptBlock { &"$($args[0])filename.cmd" } -ArgumentList $path
# With 'Using' variable
Start-Job -ScriptBlock { &"$($Using:path)filename.cmd" }

最后,如果适用于您的案例,您可以考虑使用Start-Processcmdlet,而不是Start-Job。"启动进程"允许您在不等待*.cmd批处理完成的情况下继续执行脚本。。。而且使用起来更简单:

Start-Process -FilePath "filename.cmd" -WorkingDirectory $path

最新更新