簡體   English   中英

Windows批處理腳本 - 將文件名讀入變量

[英]Windows Batch Script - Read file names into variables

我試圖逐個轉換目錄中的文件(電影)。 每個新轉換的文件都需要分配一個新文件名 - 舊文件名具有新擴展名。

我已經嘗試過以下內容來閱讀源文件,剝離擴展並分配一個新文件:

@echo off
setlocal DisableDelayedExpansion
cd \target_dir
for %%x in (*) do (
  echo %%x
  set source=%%x
  echo Source #%source%#
  set target=%source:.mpg=%
  echo Target #%target%#
  transcode %source% %target%.mp4
)

不幸的是,這不起作用。 如輸出所示,我甚至無法將當前文件復制到變量“source”中:

E:\target_dir>..\test.bat
movie1.mpg
source ##
target ##
movie2.mpg
source ##
target ##

我用Google搜索並認為我已找到正確的語法,但這似乎不是它。 謝謝你的幫助!

這有效:

@echo off
cd \target_dir
for %%x in (*) do (
    transcode "%%x" "%%~nx.mp4"
)

請注意,您不能在標准環境變量上使用%%~n語法 - 您需要直接訪問for循環變量。

編輯:添加引號以使批處理使用其名稱中也包含空格的文件。

jlahd顯示正確的解決方案,而不將文件名復制到變量。

但我想解釋你目前的問題。

如輸出所示,我甚至無法將當前文件復制到變量“source”中:

你找到了BBB(批量初學者bug),實際上你設置了變量,但是你以后無法訪問內容。

這是批處理解析器使用代碼塊的效果,因為這些塊被解析並且在執行代碼之前將完成百分比擴展。
代碼塊是括號內的代碼或由&&&||連接的命令

為了避免這個問題,引入了延遲擴展。
然后你就可以使用!variable! 在運行時擴展變量。

setlocal EnableDelayedExpansion
cd \target_dir
for %%x in (*) do (
  echo %%x
  set source=%%x
  echo Source #!source!#
  set target=!source:.mpg=!
  echo Target #!target!#
  transcode !source! !target!.mp4
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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