Цикл не работает, если ему предшествует «cd /d» (Windows 10, пакетный файл)

Цикл не работает, если ему предшествует «cd /d» (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перед командами, ничего не происходит.

Раньше я пытался указать папку напрямую в цикле FOR, добавляя /Sк команде DIR, но это копировало неправильный файл 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%".

Связанный контент