#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