[英]Piping results from ls into command in Powershell, capturing with regex
我正在嘗試通過將 ls 的結果傳送到 function 中來批量編輯某些視頻文件的元數據,該 function 在元數據中編輯視頻文件的名稱。 例子:
文件:
元數據中所需的標題重命名:
我在 PowerShell 中使用來自 MKVToolNix 的 mkvpropedit function,它可用於通過以下方式重命名單個文件的標題:
C:\"Program Files"\MKVToolNix\mkvpropedit 'My Movie 1 - 1080p DTS 5.1.mkv' -e info -s title='My Movie 1'
這非常有效,但是我希望能夠對整個目錄執行此操作,從元數據標題中的破折號中刪除所有內容。 這是我在下面嘗試的代碼,將 ls 的結果通過管道傳輸到命令中(我應該提到目錄中的每個文件都是我希望編輯的電影文件)並使用正則表達式捕獲文件名的所需部分。
ls | C:\"Program Files"\MKVToolNix\mkvpropedit {$_.name} -e info -s title={$_.name -replace('(.+)-.+', '$1')}
據我所知,正則表達式是正確的,但我收到以下錯誤:
mkvpropedit.exe:已經指定了命令參數。 在行:1 字符:6
ls | C:"程序文件"\MKVToolNix\mkvpropedit {$_.name} -e info -s t... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo: InvalidArgument: (:) [], ParameterBindingException
fullyQualifiedErrorId: ParameterSpecifiedAlready
正如評論中所建議的,我也嘗試了一個 foreach 循環:
ls | foreach{C:\"Program Files"\MKVToolNix\mkvpropedit {$_.name} -e info -s title={$_.name -replace('(.+)-.+', '$1')}}
這產生了相同的錯誤,針對目錄中的每個文件一次。 我在這里做錯了什么? 有沒有更好的方法來接近我想要的結果? 謝謝!
看起來您正在嘗試使用延遲綁定腳本塊( {... }
引用$_
作為當前管道輸入變量的塊),但是,直接調用外部可執行文件(如mkvpropedit
)不支持該腳本塊.
相反,您必須使用ForEach-Object
調用並使用基於$_
的表達式來制定您的 arguments:
Get-ChildItem | ForEach-Object {
C:\"Program Files"\MKVToolNix\mkvpropedit $_.name -e info -s title=$($_.name -replace '(.+)-.+', '$1')
}
$_.name
將當前管道輸入對象的 ( $_
) .name
屬性作為參數傳遞。
title=$($_.name -replace '(.+)-.+', '$1')
使用子表達式運算符$()
將表達式的結果合並到單個title=<value>
參數中。
注意:雖然通過C:\"Program Files"\MKVToolNix\mkvpropedit
調用確實有效,但引用樣式不尋常; 更典型的是,您會將整個路徑括在引號中:
"C:\Program Files\MKVToolNix\mkvpropedit"
(或者,假設沒有要擴展的變量,使用單引號:
'C:\Program Files\MKVToolNix\mkvpropedit'
但是,如果路徑作為一個整體被引用和/或包含變量引用,則出於語法原因,您必須通過調用運算符&
調用:
& 'C:\Program Files\MKVToolNix\mkvpropedit'...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.