簡體   English   中英

將 ls 的結果通過管道傳輸到 Powershell 中的命令中,使用正則表達式捕獲

[英]Piping results from ls into command in Powershell, capturing with regex

我正在嘗試通過將 ls 的結果傳送到 function 中來批量編輯某些視頻文件的元數據,該 function 在元數據中編輯視頻文件的名稱。 例子:

文件:

  • 我的電影 1 - 1080p DTS 5.1.mkv
  • 我的電影 2 - 720p DTS 2.1.mkv
  • 我的電影 3 - 480p AAC 1.0.mkv

元數據中所需的標題重命名:

  • 我的電影 1
  • 我的電影 2
  • 我的電影 3

我在 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>參數中。

    • 注意:在使用()時, 分組運算符本身足以將表達式的結果作為參數傳遞,在諸如title=<value>之類的復合參數的情況下,它不起作用,因為 PowerShell 的參數綁定器考慮了(...)表達一個單獨的參數
      使用$()確實可以作為復合標記,因為 PowerShell 然后隱式處理整個標記,就好像它包含在"..."中,即它把它當作一個可擴展的字符串

注意:雖然通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM