Если я запущу это в пакетном файле внутри папки с файлами 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%"
.