Acceso denegado al enviar al nombre de archivo usando una variable

Acceso denegado al enviar al nombre de archivo usando una variable

Windows 10, en mi propia carpeta Vídeos en Perfil de usuario.

Estoy tratando de unir un par de cosas para crear un archivo de texto completo que contenga diversa información, en una sola línea de comando, ¿verdad?

El objetivo es crear un texto único con un encabezado, información generada y un pie de página. El texto tendrá el mismo nombre que el nombre de la carpeta al .txtfinal, por razones de simplicidad.

Mi objetivo es ejecutar la cadena de comandos una vez por carpeta, y dado que hay bastantes llamadas al nombre de la carpeta a la que se dirige, pensé en usar una variable para acortarla.

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

Esto funcionó absolutamente perfectamente, pero se volvió bastante tedioso cambiar el nombre de la carpeta para todas las apariciones, así que ¿por qué no usar una variable, verdad?

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

Esto da tres access deniedmensajes. Inicialmente estaba usando espacios antes y después de las llamadas a variables y los eliminé después de leer una publicación que decía que los espacios pueden estropear las cosas, pero todavía no sirvió de nada y estoy realmente estancado en esto. Cuando lo hago, echo %a%devuelve el nombre de la carpeta sin ningún problema.

¿Qué me estoy perdiendo?

Respuesta1

CMD escanea toda la línea en busca de variables antes de procesarlas. Por lo tanto, lo reemplaza %a%con nulo (o lo que sea que esté configurado previamente) antes de procesar el set a=...comando. Deberá hacerlo en una línea separada:

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

Pero, además (como descubriste), el setcomando (estúpidamente, en mi humilde opinión) incluye todo hasta un separador de comandos. Entonces

set a=SoLong & echo /%a%/

se establecerá aen SoLong (con un espacio al final). Una forma de manejar esto es omitir el espacio antes de &:

set a=SoLong& echo ...

pero se considera que es menos legible. Una solución un poco mejor es poner el setcomando entre paréntesis:

(set a=SoLong) & echo ...

por lo que el valor termina en ).

información relacionada