当前面有“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 /dfor 循环会忽略它,它不起作用:

:: 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在命令前放置它,但没有任何反应。

以前,我尝试通过添加/SDIR 命令直接在 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,例如使用set "PrevDir=%CD%"

相关内容