當前面有「cd /d」時,For 循環不起作用(Windows 10,批次檔)

當前面有「cd /d」時,For 循環不起作用(Windows 10,批次檔)

如果我在 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%".

相關內容