Windows 10, в моей папке «Видео» в разделе «Профиль пользователя».
Я пытаюсь объединить несколько вещей, чтобы создать полноценный текстовый файл, содержащий различную информацию, в одной командной строке, верно?
Цель состоит в том, чтобы сделать один txt с заголовком, некоторой сгенерированной информацией и колонтитулом. txt будет назван так же, как и имя папки, с _ .txt
в конце, для простоты.
Я собираюсь запускать строку команд один раз для каждой папки, и поскольку вызовов имени целевой папки довольно много, я решил использовать переменную, чтобы сократить ее.
type header.txt > VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./VeryLongFolderNameFooBar/*.mkv >> VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt & type footer.txt >> VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt
Это сработало абсолютно идеально, но было довольно утомительно менять имя папки для всех случаев, так почему бы не использовать переменную, верно?
set a=VeryLongFolderNameFooBar && type header.txt>%a%\%a%.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./%a%/*.mkv>>%a%\%a%.nfo & type footer.txt>>%a%\%a%.txt
Это дает три access denied
сообщения. Изначально я использовал пробелы до и после вызовов переменных и удалил их после прочтения поста о том, что пробелы могут все испортить, но все равно безрезультатно, и я действительно застрял на этом. Когда я echo %a%
это делаю, он возвращает имя папки без каких-либо проблем.
Что я упускаю?
решение1
CMD сканирует всю строку на предмет переменных, прежде чем фактически обработает любую из них. Поэтому он заменяет ее %a%
на null (или на то, что было установлено ранее) перед тем, как обработать set a=...
команду. Вам нужно будет сделать это на отдельной строке:
set a=VeryLongFolderNameFooBar
type header.txt>%a%\%a%.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./%a%/*.mkv>>%a%\%a%.nfo & type footer.txt>>%a%\%a%.txt
Но, кроме того (как вы обнаружили), set
команда (глупость, IMHO) включает в себя все, вплоть до разделителя команд. Так что
set a=SoLong & echo /%a%/
будет установлено a
в SoLong
(с конечным пробелом). Один из способов справиться с этим — убрать пробел перед &
:
set a=SoLong& echo ...
но это широко считается менее читабельным. Чуть более изящное решение — заключить set
команду в скобки:
(set a=SoLong) & echo ...
поэтому значение завершается символом )
.