1

ディレクトリ内の各ファイルに対して外部プログラム ( SoX )を呼び出すスクリプトがあります。SoX への各呼び出しWrite-Progressの前に呼び出していますが、進行状況バーは SoX の出力によってコンソール バッファーの上部から押し出されます (コンソールのサイズに関係なく)。これを避けるためにできることはありますか?

スクリプトは次のとおりです。

$audioFiles = ls -Exclude *.ps1 | ? { !$_.PSIsContainer } 
foreach ($audioFile in $audioFiles)
{
    $i++
    Write-Progress -Activity "Transforming Audio" -Status $audioFile.Name -PercentComplete (($i / @($audioFiles).length) * 100)
    & 'C:\Program Files (x86)\sox-14-4-0\sox.exe' "$audioFile" ('Fast/' + $audioFile.Name) -S -G tempo -s 1.3 
}

Write-Progress -Activity "Transforming Audio" -PercentComplete 100 -Completed

[void] [Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) 
[windows.forms.messagebox]::show(“All done!”) 
4

1 に答える 1

0

おそらく、sox 出力の前に同じコンソール カーソル位置を設定できますか? してみてください

$audioFiles = ls -Exclude *.ps1 | ? { !$_.PSIsContainer } 
foreach ($audioFile in $audioFiles){
    $i++
    Write-Progress -Activity "Transforming Audio" -Status $audioFile.Name -PercentComplete (($i / @($audioFiles).length) * 100)

    # get windows height 
    $y=[int]($host.ui.rawui.WindowSize.Height -5)
    # will set cursor position to bottom of the screen 
    $Host.UI.RawUI.CursorPosition = New-Object System.Management.Automation.Host.Coordinates 2,$y 
    #clear current line
    $sbOut = new-object System.Text.Stringbuilder
    (0.. $Host.UI.RawUI.WindowSize.Width)|%{$sbOut.append(' ')} |out-Null
    write-Host $sbOut.toString() -NoNewline

    & 'C:\Program Files (x86)\sox-14-4-0\sox.exe' "$audioFile" ('Fast/' + $audioFile.Name) -S -G tempo -s 1.3 
    }
Write-Progress -Activity "Transforming Audio" -PercentComplete 100 -Completed
[void] [Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) 
[windows.forms.messagebox]::show(“All done!”)

sox 出力をファイルにリダイレクトすることもできます。また、sox 出力を気にしない場合は、 out-null にリダイレクトするだけです。

& 'C:\Program Files (x86)\sox-14-4-0\sox.exe' "$audioFile" ('Fast/' + $audioFile.Name) -S -G tempo -s 1.3 | out-null
于 2012-11-20T07:48:47.193 に答える