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 .txt
final, 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 denied
mensagens. 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 set
comando (estupidamente, IMHO) inclui tudo, até um separador de comando. Então
set a=SoLong & echo /%a%/
será definido a
como 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 set
comando entre parênteses:
(set a=SoLong) & echo ...
então o valor é finalizado pelo )
.