gpt4 book ai didi

powershell - 限制在 powershell 中运行的 Start-Process 数量

转载 作者:行者123 更新时间:2023-12-04 23:14:47 31 4
gpt4 key购买 nike

我试图限制 Start-Process 的数量从 Powershell 运行,但我似乎无法让它工作。

我试图遵循这个过程:https://exchange12rocks.org/2015/05/24/how-to-limit-a-number-of-powershell-jobs-running-simultaneously/Run N parallel jobs in powershell

但这些是针对工作而非流程的,我想删除 -Wait来自 Start-Process
我对脚本的担忧是,如果文件夹中有 1000 个音频文件,那么 FFMpeg 会使系统崩溃。

# get the folder for conversion
function mbAudioConvert {
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
[System.Windows.Forms.Application]::EnableVisualStyles()

$fileBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$fileBrowser.SelectedPath = "B:\"
$fileBrowser.ShowNewFolderButton = $false
$fileBrowser.Description = "Select the folder with the audio which you wish to convert to Avid DNxHD 120 25P 48kHz"

$mbLoop = $true
$mbCount = 0001
$mbMaxJob = 4

while( $mbLoop ) {
if( $fileBrowser.ShowDialog() -eq "OK" ) {
$mbLoop = $false


$mbImage = ( Get-Item -Path "C:\Users\user\Desktop\lib\AudioOnly.jpg" )
$mbff32 = ( Get-Item -Path "C:\Users\user\Desktop\lib\ffmpeg32.exe" )
$mbff64 = ( Get-Item -Path "C:\Users\user\Desktop\lib\ffmpeg64.exe" )

$mbFolder = $fileBrowser.SelectedPath
$mbItemInc = ( ls $mbFolder\* -Include *.mp3, *.MP3, *.wav*, *.WAV*, *.ogg, *.OGG, *.wma, *.WMA, *.flac, *.FLAC, *.m4a, *.M4a )
$mbProgress = ( Get-ChildItem -Path $mbItemInc )

$mbHasRaw = ( $mbFolder + "\RAW" )

if( !( Test-Path -Path $mbHasRaw ) ) {
# force create a RAW folder if it does not exist
New-Item -ItemType Directory -Force -Path "$mbHasRaw"
}


foreach( $mbItem in $mbItemInc ) {

$mbCheck = $false

# output the progress
# Suggestion: You might want to consider updating this after starting the job and do the final update after running ex. Get-Job | Wait-Job to make the progress-bar stay until all processes are finished
#Write-Progress -Activity "Counting files for conversion" -status "Currently processing: $mbCount" -percentComplete ($mbCount / $mbItemInc.count*100)

# limit the run number
while ($mbCheck -eq $false) {

if( (Get-Job -State 'Running').count -lt $mbMaxJob) {

$mbScriptBlock = {
$mbItemName = $using:mbItem.BaseName

$mbNewItem = ( $using:mbFolder + "\RAW\" + $mbItemName + ".mov" )
$mbArgs = " -loop 1 -i $using:mbImage -i $using:mbItem -shortest -c:v dnxhd -b:v 120M -s 1920x1080 -pix_fmt yuv422p -r 25 -c:a pcm_s16le -ar 48k -af loudnorm=I=-12 $mbNewItem"

Start-Process -FilePath $using:mbff32 -ArgumentList $mbArgs -NoNewWindow -Wait
}

Start-Job -ScriptBlock $mbScriptBlock

#The job-thread doesn't know about $mbCount, better to increment it after starting the job
$mbCount++
$mbCheck = $true
}

}
}

} else {

$mbResponse = [System.Windows.Forms.MessageBox]::Show("You have exited out of the automation process!", "User has cancelled")
if( $mbResponse -eq "OK" ) {
return
}
}
}

$fileBrowser.SelectedPath
$fileBrowser.Dispose()
}

# call to function
mbAudioConvert

最佳答案

  • 您编辑 $mbCheck ,但 while 循环正在测试 $Check这意味着 while 循环永远不会以 $Check -eq $false 的形式执行。是 $false$Check未定义
  • 在作业脚本 block 之外创建的变量需要作为参数传递,或者您需要使用 using:变量范围来传递它们(PowerShell 3.0 或更高版本)。添加到 $mbItem , $mbff32 , $mbImage$mbFolder在未定义的示例中。
  • $mbMaxJob没有定义。 get running jobs-check 永远不会为真,并且不会启动任何进程
  • $mbCount没有定义的。进度条不起作用
  • echo "$mbCount. $mbNewItem"除非您使用 Receive-Job,否则不会返回任何内容在某个时候从工作中获得输出

  • 尝试:
    #DemoValues
    $mbItemInc = 1..10 | % { New-Item -ItemType File -Name "File$_.txt" }
    $mbff32 = "something32"
    $mbFolder = "c:\FooFolder"
    $mbImage = "BarImage"
    $mbMaxJob = 2
    $mbCount = 0

    foreach( $mbItem in $mbItemInc ) {

    $mbCheck = $false

    # output the progress
    # Suggestion: You might want to consider updating this after starting the job and do the final update after running ex. Get-Job | Wait-Job to make the progress-bar stay until all processes are finished
    Write-Progress -Activity "Counting files for conversion" -status "Currently processing: $mbCount" -percentComplete ($mbCount / $mbItemInc.count*100)

    # limit the run number
    while ($mbCheck -eq $false) {

    if ((Get-Job -State 'Running').count -lt $mbMaxJob) {

    $mbScriptBlock = {

    Param($mbItem, $mbFolder, $mbImage, $mbff32)
    #Filename without extension is already available in a FileInfo-object using the BaseName-property
    $mbItemName = $mbItem.BaseName

    $mbNewItem = ( $mbFolder + "\RAW\" + $mbItemName + ".mov" )
    $mbArgs = "-loop 1 -i $mbImage -i $mbItem -shortest -c:v dnxhd -b:v 120M -s 1920x1080 -pix_fmt yuv422p -r 25 -c:a pcm_s16le -ar 48k -af loudnorm=I=-12 $mbNewItem"

    Start-Process -FilePath $mbff32 -ArgumentList $mbArgs -NoNewWindow -Wait
    }

    Start-Job -ScriptBlock $mbScriptBlock -ArgumentList $mbItem, $mbFolder, $mbImage, $mbff32

    #The job-thread doesn't know about $mbCount, better to increment it after starting the job
    $mbCount++
    $mbCheck = $true
    }

    }
    }

    关于powershell - 限制在 powershell 中运行的 Start-Process 数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49092756/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com