Acesso negado ao enviar para nome de arquivo usando variável

Acesso negado ao enviar para nome de arquivo usando variável

Windows 10, na minha própria pasta Vídeos em UserProfile.

Estou tentando juntar algumas coisas para fazer um arquivo txt completo contendo diversas informações, em uma única linha de comando, certo.

O objetivo é fazer um único txt com cabeçalho, algumas informações geradas e rodapé. O txt terá o mesmo nome do nome da pasta no .txtfinal, para simplificar.

Meu objetivo é executar a sequência de comandos uma vez por pasta e, como há algumas chamadas para o nome da pasta que está sendo direcionada, resolvi usar uma variável para encurtá-la.

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

Isso funcionou perfeitamente, mas ficou muito tedioso alterar o nome da pasta para todas as ocorrências, então por que não usar uma variável, certo?

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

Isto dá três access deniedmensagens. Inicialmente eu estava usando espaços antes e depois das chamadas de variáveis ​​e os removi depois de ler um post que os espaços podem bagunçar as coisas, mas ainda não adiantou e estou realmente preso nisso. Quando faço echo %a%isso, ele retorna o nome da pasta sem nenhum problema.

o que estou perdendo?

Responder1

O CMD verifica a linha inteira em busca de variáveis ​​antes de realmente processá-las. Portanto, ele substitui %a%por null (ou o que foi definido anteriormente) antes de processar o set a=...comando. Você precisará fazer isso em uma linha 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

Mas, além disso (como você descobriu), o setcomando (estupidamente, IMHO) inclui tudo, até um separador de comando. Então

set a=SoLong & echo /%a%/

será definido acomo SoLong (com um espaço à direita). Uma maneira de lidar com isso é deixar de fora o espaço antes de &:

set a=SoLong& echo ...

mas isso é amplamente considerado menos legível. Uma solução um pouco melhor é colocar o setcomando entre parênteses:

(set a=SoLong) & echo ...

então o valor é finalizado pelo ).

informação relacionada