如果我在 MP4 檔案資料夾內的批次檔中運行它,它會將最後修改的 MP4 檔案設為變量,以便可以使用預設媒體播放器播放它:
:: Set last modified MP4 file in current folder, as a variable...
for /f "eol=: delims=" %%F in ('dir /B /O:D *.mp4') do @set "newest=%%F"
:: Play the file (opens in default media player)...
"%newest%"
如果我嘗試將以下內容放入 MP4 檔案資料夾之外的批次檔中,然後cd /d
被 for 迴圈忽略,則它不起作用:
:: Change to directory containing MP4 files...
cd /d "C:\My Videos"
:: Set last modified MP4 file in "C:\My Videos", as a variable (not working)...
for /f "eol=: delims=" %%F in ('dir /B /O:D *.mp4') do @set "newest=%%F"
:: Copy the MP4 to current folder...
xcopy "%newest%" "%CD%" /i /r /v /k /f /c /h /y >nul 2>&1
:: Change back to current directory
cd /d "%CD%"
如您所見,每個範例中的 for 迴圈指令完全相同。它在第一個中有效,但在第二個中無效。
我嘗試pause
在每個命令之間放置以查看是否出現任何錯誤,但沒有出現任何錯誤。
我嘗試去掉周圍的雙引號%CD%
- 沒有什麼區別。
我嘗試將命令放在Setlocal EnableDelayedExpansion
命令之前,但沒有執行任何操作。
以前,我嘗試透過新增/S
到 DIR 命令直接在 FOR 循環中指定資料夾,但由於某種原因複製了錯誤的 MP4 文件,其中修改的日期是無意義的隨機日期,它不是上次修改的 MP4。該命令是這樣的:
for /f "eol=: delims=" %%F in ('dir /B /S /O:D "C:\My Videos\*.mp4"') do @set "newest=%%F"
這確實將 MP4 設為變數...但不是正確的!
在 MP4 文件的資料夾中使用批次文件,我知道它總是這樣工作。
預先感謝任何可以闡明為什麼這不起作用的人。
答案1
您的腳本假設%CD%
將從頭到尾保留其原始值。但這不是這個變數的工作原理——它由解釋器動態更新以始終代表當前目錄。在你的第一個cd
命令之後,路徑C:\My Videos
變成“當前”目錄。
因此,您dir
在新位置查找文件,然後xcopy
嘗試將找到的文件複製回原來的位置,最後只是cd /d "%CD%"
說“更改到我已經所在的目錄”。它不會帶你回到之前的位置,因為此時%CD%是「C:\我的影片」。
需要明確記錄之前的路徑前cd'ing 其他地方,例如使用set "PrevDir=%CD%"
.