Ошибка Batch/CMD «Система не может найти указанный файл»

#batch-file #cmd #directory-structure

Вопрос:

Я пытаюсь написать пакетный/cmd — файл, который будет переименовывать каталоги, когда найдет» -«, то есть пробел. Я думал, что у меня есть все, что мне нужно, выводя вещи через Echo, а на самом деле не переименовывая их. Затем я протестировал его в нескольких каталогах, и он отлично работал.

Когда я попытался переместить его в сетевую папку/подпапку, я обнаружил, что мне нужна команда PushD. Опять же, все хорошо, если я запущу его в определенном каталоге.

Информация о пути будет выглядеть примерно так:

 \MyNetworkStorageTopLevelFolderMusic
 

С последующим:

 Artist1
    Artist1 - Album1
    Artist1 - Album2
    Artist1 - Album3
Artist2
    Artist2 - Album1
    Artist2 - Album2
 

Вы поняли идею.

Если я запущу пакетный файл в любом:

  • MyNetworkStorateПапка верхнего уровняМузыкаАртист1 или
  • MyNetworkStorateПапка верхнего уровняMusicArtist2

все хорошо. Если я попытаюсь сделать это с одного уровня выше, то есть:

  • MyNetworkStorateПапка верхнего уровняМузыка

Я получаю следующую ошибку для каждого отдельного каталога.:

«Система не может найти указанный файл»

Поиск в Google подсказывает мне, что путь может быть долгим, и я следовал инструкциям, чтобы

  • Политика локального компьютера > Конфигурация компьютера >> Административные шаблоны >>> Система >>>> Файловая система
  • Дважды щелкните опцию Включить длинные пути Win32 и включите ее

Еще одно предложение было при запуске моего файла .cmd на локальном компьютере, чтобы предварить его: cmd.exe /c MyCmdFile.cmd

Ничто из того, что я искал, не решило мою проблему.

Я новичок в пакетных файлах, так что, возможно, проблема на самом деле в том, что я собрал за последние 1,5 дня. На данный момент я жалею, что не написал для этого программу на C#. Я думал, что это будет просто. Есть какие-нибудь предложения?

Опять же, если я начну его в каталоге какого-либо конкретного исполнителя, он переименует все подкаталоги, удалив часть «Имя исполнителя», и оставит только название альбома, как я хочу. Когда я перемещаюсь в каталог, содержащий всех исполнителей, это не удается. Я изменяю эту строку в строке, которая начинается с «PUSHD» командного файла.

 @Echo Off
setlocal EnableDelayedExpansion 

PUSHD \MyNetworkMusicHighRez <<<---This fails
PUSHD \MyNetworkMusicHighRezAny Artist I pick <<<---This works for all sub directories
:: If this fails then exit
If %errorlevel% NEQ 0 goto:eof
:: other commands...

FOR /D /r %%G in ("* - *") DO (
SET DirName=%%~nxG

set "NewName=!DirName:* - =!"

Echo Renaming from "!DirName!" To "!NewName!"

REM ***Remove REM from line below to actually rename once you are happy with results
ren "!DirName!" "!NewName!"
)
popd
 

Комментарии:

1. Ограничение по пути по умолчанию уже довольно длинное; я сомневаюсь, что вы попадаете в него, основываясь на вашем описании. Похоже, у вас возникли проблемы с разрешениями для папки HighRez, и вам не разрешено входить в нее, но разрешения для вложенных папок настроены правильно.

2. Я согласен, что длина пути казалась маловероятной, учитывая, что некоторые имена исполнителей/альбомов довольно длинные. И так как это работает, когда я пробую длинные работы конкретного художника, это работает нормально. Плюс ко всему, это терпит неудачу для всех, ни разу, когда я начинаю на этом более высоком уровне.

3. Вы должны использовать %%G вместо !DirName! команды переименования.

4. @Squashman Я получаю ту же ошибку. Однако теперь я вижу, что я думаю, это сопоставленный диск и частичный путь, который добавляет PUSHD. Оригинально с ! ДирНаме! Renaming from "Nirvana - Unplugged (24-48)" To "Unplugged (24-48)" The system cannot find the file specified. Переименование из Z:HighRezNirvanaNirvana — Отключен от сети (24-48) Для «Отключено (24-48)» Синтаксис команды неверен. С %%G: Renaming from Z:HighRezNirvanaNirvana - Unplugged (24-48) To "Unplugged (24-48)" Синтаксис команды неверен.

5. Ваш код в вашем вопросе показывает кавычки в команде переименования, но в вашем примере вывода в комментарии кавычки не отображаются. Независимо от того, нужны цитаты или нет, вы всегда должны использовать их в качестве наилучшей практики. Вы должны использовать %%G , потому что это полный путь к имени каталога. Переменная DirName -это только имя каталога, и она не существует в текущем рабочем каталоге. Поэтому команда переименования должна быть ren "%%G" "!NewName!" , я бы подумал, что с любым языком программирования, который вы используете, вы всегда должны знать, что такое текущий рабочий каталог.

Ответ №1:

Это то, что в конечном итоге сработало для всех, кому может понадобиться что-то подобное. Это была комбинация использования %%G вместе с кавычками вокруг него, как в:

 ren "%%G" "!NewName!"
 

Вместо исходной переменной «!Имя Дирна!»

Рабочий пример, наконец 😉

 @Echo Off
setlocal EnableDelayedExpansion 

PUSHD \NASBoxOnNetworkMusicHighRez
:: If this fails then exit
If %errorlevel% NEQ 0 goto:eof
:: other commands...

FOR /D /r %%G in ("* - *") DO (
SET DirName=%%~nxG

set "NewName=!DirName:* - =!"

Echo Renaming from "%%G" To !NewName!

REM ***Remove REM from line below to actually rename once you are happy with results
ren "%%G" "!NewName!"
)
popd