我正在嘗試創建一個for循環,它將通過一個目錄並對該目錄中的所有文件運行ffmpeg命令。我的問題是某些文件的名稱中有!
,這在使用延遲擴展時會導致問題。我研究了許多解決方案,其中沒有一個能夠讓我找到任何地方。目前我可以使用包含的!
來回顯文件名,但我似乎無法通過!
將文件名傳遞到我的for循環中,因爲延遲擴展有效地刪除了!
。批處理文件:轉義!在For循環中
這裏是我的批處理腳本:
@echo off
setlocal enabledelayedexpansion
for %%f in ("Y:\Samples\Test Videos\*.mkv") do (
set "filename=%%~nxf"
ffmpeg -i "%%f" -vcodec copy -acodec copy -scodec copy -vbsf h264_changesps=level=40 -vbsf h264_changesps=fps=24000:1001 "E:\Converted\!filename!"
)
pause
這對所有文件工作正常,沒有在名稱中!
。如果我使用批處理腳本是這樣的:
@echo off
for %%f in ("Y:\Samples\Test Videos\*.mkv") do (
call :command "%%f"
)
pause
:command
set "fname=%~nx1"
set "fpath=%~dpnx1"
echo %fname%
ffmpeg -i %fpath% -vcodec copy -acodec copy -scodec copy -vbsf h264_changesps=level=40 -vbsf h264_changesps=fps=24000:1001 "E:\Converted\%fname%"
然後,我可以得到的文件名和完整路徑與包括!
呼應,但ffmpeg的命令引用%fname%
和%fpath%
返回No such file or directory
消息。如果我在SetLocal EnableDelayedExpansion
之後加上echo off並將ffmpeg字符串更改爲!
而不是%
,那麼我將再次獲得No such file or directory
消息。
我知道,在聲明的DO
部分FOR
環路一切都得到一切這就是爲什麼我需要使用延遲擴展前擴大,但我該如何使用,並仍在使用包含!
文件名?有沒有辦法讓第一批接受名稱中包含!
的文件?
你忘了提及沒有需要CALL。 CALL會破壞包含'^'的任何名稱。你的代碼應該適用於所有情況。 – dbenham
出色的工作MC ND!這很簡單,後見之明很有意義! – Trevor