Доступ запрещен при выводе в файл с использованием переменной

Доступ запрещен при выводе в файл с использованием переменной

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 ...

поэтому значение завершается символом ).

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