【问题标题】:Powershell call batch within scriptblock脚本块中的Powershell调用批处理
【发布时间】:2017-04-19 03:38:13
【问题描述】:

我有下面的脚本没有按我想要的方式工作。最初,我想将 install.cmd 传递给将在后台使用“Start-Job”的函数,这样它就不会冻结主 Powershell 窗口。但我无法让它调用 install.cmd。

$Appname = @("Adobe_FlashPlayer", "Acrobat_Reader", "Microsoft_RDP")

function BatchJob{

    Param (
        [ScriptBlock]$batchScript,
        $ArgumentList = $null)
    #Start the batch
    $batch = Start-Job -ScriptBlock $batchScript -ArgumentList $ArgumentList

}

Foreach($App in $Appname){
    $Install = "C:\test\$App\Install.cmd"
    Batchjob -batchscript {Invoke-Command (cmd / c)} -ArgumentList $install     
    Wait-Job $job
    Receive-Job $job
}

【问题讨论】:

  • 您定义了$Install = "C:\test\$App\Install.cmd",但从不在此之外引用它。我认为您需要将 Invoke-Command 设为 {Invoke-Command "cmd.exe /c $install"} 您会遇到问题,因为(假设有多个应用程序使用 Windows Installer)当您尝试启动时,Windows Installer 将忙于第一个应用程序安装第二个(和第三个等)以及第一个之后的应用程序将失败。
  • 啊我实际上忘记在“-argumentlist”末尾添加 $install 请参阅上面的更新代码。我尝试了您的代码,但它只是给了我“从上述路径调用 cmd...”的错误。一如既往地感谢 Madtechnician。
  • 您的脚本块{Invoke-Command (cmd / c)} 没有定义的参数,您可以将该参数传递给该参数。您到底希望它对参数列表做什么?它是否应该本质上知道将其附加到传递给Invoke-Command的命令的末尾?

标签: powershell scriptblock


【解决方案1】:

我相信你过度杀戮(有点)。 这有效:

$Appname = @("Adobe_FlashPlayer", "Acrobat_Reader")

Foreach($App in $Appname){
    $Install = "C:\test\$App\Install.cmd"
    $job = Start-Job ([scriptblock]::create("cmd /C $Install"))
    Wait-Job $job
    Receive-Job $job
}

*mjolinor 救援:https://stackoverflow.com/a/25020293/4593649

此外,这种变化也很好用:

$Appname = @("Adobe_FlashPlayer", "Acrobat_Reader")

Foreach($App in $Appname){
    $Install = "C:\test\$App\Install.cmd"
    $scriptBlock = ([scriptblock]::create("cmd /C $Install"))
    $job = Start-Job $scriptBlock
    Wait-Job $job
    Receive-Job $job
}

使用 PShell ver4 测试。 干杯!

【讨论】:

  • 嗨,马林。感谢您的回答,我在另一个站点(Sapien)上找到了这个脚本,我正在尝试添加它,以便调用我拥有的批次。这是该网站的链接。你能帮我实现这个吗? link
  • @Besiktas - 你到底想做什么?您是否测试过提供的代码?它有效吗?我相信您应该将此问题标记为已回答并提出另一个问题。但是这一次,请描述你希望你的脚本做什么。我可以看到几个场景: 1. 在本地机器上运行批处理脚本,在所有批处理脚本启动后,等待它们停止,收集数据并呈现结果; 2. 使用 PSRemoting 在多台远程机器上运行批处理脚本(这意味着在目标机器上启用了 PSRemoting); 3.其他远程管理方式等
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 2011-05-22
  • 1970-01-01
  • 2018-04-13
  • 2013-07-30
  • 1970-01-01
  • 2020-02-22
  • 2014-12-03
相关资源
最近更新 更多