PR

PowerShellで「-」と「:」を含むコマンドが正常に動作しない場合の対処法

プログラミング

結論

一番簡単な対処法は「-」「:」を含む引数を「”」などで囲むことです。

ffmpeg -i input.mp4 "-c:v" h264_nvenc output.mp4

原因

PowerShellには以下のコマンドを同様のものとして扱う仕様があります。( 記事執筆現在 ( PowerShell 7.5.1 ) )

-<parameter_name> <parameter_value>
-<parameter_name>:<parameter_value>
about_Parameters - PowerShell
PowerShell でコマンド パラメーターを操作する方法について説明します。

この仕様によって本来「-c:v」としてコマンドに渡したい引数が「-c:」と「v」に分けられ、思わぬエラーが発生します。

このエラーが発生する状況

私の場合は以下の関数をPowerShwll起動時に読み込んでいます。

function ffmpeg {
    ffmpeg.exe -hide_banner $args
}

このような場合に上記のような状況が発生し得ます。

まじめな解決策

「”」で毎回囲むのが面倒な人向けです。

解決策と言っても要は分割されるなら結合し直せばいいだけです。

function Merge-ColonSeparatedArgs {
    if ($Args.Count -eq 0) {
        return @()
    }
    
    $result = @()
    $i = 0
    
    while ($i -lt $Args.Count) {
        $currentArg = $Args[$i]

        # ハイフンで始まらない引数はそのまま追加
        if (-not $currentArg.StartsWith("-")) {
            $result += $currentArg
            $i++
            continue
        }

        # コロンで終わらない引数はそのまま追加
        if (-not $currentArg.EndsWith(":")) {
            $result += $currentArg
            $i++
            continue
        }

        # 次の引数が存在する場合結合して追加
        if ($i + 1 -lt $Args.Count) {
            $nextArg = $Args[$i + 1]
            $result += "$currentArg$nextArg"
            $i += 2
            continue
        }
        
        # 通常の引数処理
        $result += $currentArg
        $i++
    }
    
    return $result
}

このような関数を作成し、

function ffmpeg {
    $args = Merge-ColonSeparatedArgs $args
    ffmpeg.exe -hide_banner $args
}

このように使用すれば解決します。

まとめ

PowerShellのエイリアス設定がまともなら起き得ないエラーでした。

コメント

タイトルとURLをコピーしました