【问题标题】:Run a external program with parameters and wait for it to end in Powershell运行带参数的外部程序并在Powershell中等待它结束
【发布时间】:2019-05-24 01:12:25
【问题描述】:

实际上,我已经找到了很多解决这个问题的方法,但没有一个有效。 我想在 Powershell 中运行的程序是 Reaper - 一个数字音频工作站,我将使用它的命令行工具来批处理 PS 脚本中的音频文件。 Reaper相关代码如下:

reaper -batchconvert $output_path\audio\Reaper_filelist.txt

我将使用Start-Process-wait 参数来让我的脚本等待它结束,然后继续下一行代码,即Rename-Item 函数。

ls $processed_audio_path | Rename-Item -NewName {$_.name.Replace("- ", "")}

如果 PS 不等待进程完成,那么下一行将抛出错误,类似于“在目录中找不到此类文件”。

我找到的建议是hereherehere。但这些都不起作用。问题是 Reaper 不接受单独添加的参数为:

$exe = "reaper"
$arguments = "-batchconvert $output_path\audio\Reaper_filelist.txt"
Start-Process -filepath $exe -argumentlist $arguments -wait

或:

Start-Process -filepath reaper -argumentlist "-batchconvert $output_path\audio\Reaper_filelist.txt" -Wait

或:

Start-Process -filepath reaper -argumentlist @("-batchconvert", "$output_path\audio\Reaper_filelist.txt") -Wait

它只能像上面的第一行代码那样作为一个完整的块正常工作。 那我现在能做什么?

【问题讨论】:

  • 假设$output_path 已填充,最下面的行应该可以工作,从而形成文件列表的正确路径。像这里stackoverflow.com/questions/8761888/… 一样获取该进程的标准输出和标准错误,并调试 reaper.exe 在其命令行中接收到的数据。也有可能 reaper.exe 不在路径上,因此您需要提供可执行文件的完整路径。
  • @Vesper $output_path 没问题,我之前分配了路径。我在没有路径的情况下运行 Reaper 的原因是我已将其设置为系统的环境变量。我将根据您的建议测试标准输出和标准错误,谢谢。
  • @Vesper 我已经尝试将 filenamearguments 替换为 Reaper 及其自己的参数的代码,但是结果什么都没有。我得到了stdout: stderr: exit code: + 0
  • 可能然后使用 Procmon 或类似工具分析应用程序,它似乎没有在标准 IO 流中提供调试日志,也许你会发现它没有使用正确的参数集,无论是使用编码还是使用路径中的“额外”空格导致路径被分成几个参数。 (顺便说一句,在处理未知应用程序时尝试从任何传递的路径中消除空格总是很好的,谁知道它使用哪个 API 来获取路径。与路径中的非 ASCII 字符相同)
  • 您确定 Reaper 不会启动另一个进程然后退出第一个进程吗?这可以解释为什么 PS 不等待它。

标签: powershell powershell-v5.1


【解决方案1】:

我找到了解决这个问题的方法。
我想我需要描述更多关于这个的背景。我总是在后台用我的 Windows 启动 Reaper,当脚本调用 Reaper 的 BatchConvert 函数时,它会启动另一个 Reaper 实例,所以在转换音频文件时我得到了 2 个实例。这 - Reaper 的实例 - 可能是限制以下代码的可靠条件。我从herehere 中找到了一些有用的东西。

最后,我得到了这样的代码并且它可以工作:

# Batch converting through Reaper FX Chain
reaper -batchconvert $output_path\audio\Reaper_filelist.txt
while (@(Get-Process reaper).Count -eq 2){
    Start-Sleep -Milliseconds 500
    }
# Correct the Wrong file name produced by Reaper
ls $processed_audio_path | Rename-Item -NewName {$_.name.Replace("- ", "")}

【讨论】:

    【解决方案2】:

    正如一条评论所提到的,可能是该进程启动了另一个进程,导致 powershell 在脚本中移动。 如果是这种情况,您可以有一个 while 语句来等待文件被创建。

    while (!(Test-Path "$output_path\audio\Reaper_filelist.txt")) { Start-Sleep 10 }
    

    【讨论】:

    • 首先,Reaper生成的文件不是.txt,这是Reaper所需参数的文件列表。它实际上在另一个位置输出一个 .wav 文件。其次,下一条语句是更改 Reaper 生成的文件名,如果使用Test-Path 命令会出现问题,该文件将在进程开始时存在,但是该进程需要一段时间才能完成完成。
    • 其次,当检测到文件存在时,Rename-Item命令会立即改名,这样会导致Reaper正在处理的文件损坏或者没有更改文件名的权限,因为它已被另一个进程打开。
    • 可能有另一种方法,即找到一个以您的主进程作为父进程的进程。这些可能会有所帮助stackoverflow.com/questions/4762982/…stackoverflow.com/questions/33911332/…
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 2020-04-08
    • 2011-12-16
    • 1970-01-01
    • 2012-09-10
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多