Como eu uso um "(quote) como um delimitador FOR / F no CMD.exe no Windows 7

5

Eu quero ter um arquivo .bat obter uma lista de todos os arquivos * .XML em um projeto do Visual Studio O que eu tentei até agora é primeiro usar uma versão antiga do GREP:

SET TempName=%temp%\TEMP%RANDOM%.bat
c:\bin\grep.exe -i \.xml\^" MyProject.vcxproj  >> %TempName%

mas eu preciso pegar os nomes dos arquivos daquele arquivo temporário

Eu tentei coisas como

FOR /F "tokens=2 delims="" %%F IN (%TempName%) DO ECHO %%F
FOR /F "tokens=2 delims=^"" %%F IN (%TempName%) DO ECHO %%F
FOR /F 'tokens=2 delims="' %%F IN (%TempName%) DO ECHO %%F

mas nenhum deles funciona. Parece que o caractere delimitador " está sendo tratado como a cotação de fechamento da lista de opções, e é por isso que tentei escapar com ^ na segunda tentativa.

    
por jbalster 03.12.2012 / 21:59

2 respostas

4

Normalmente, as opções FOR estão entre aspas. Se você quiser usar uma cotação como parte de uma opção, as cotações de fechamento devem ser descartadas. Isso significa que todos os caracteres que o interpretador CMD usa como delimitadores de token devem ter escape, incluindo espaço e sinal de igual. Além disso, a citação precisa ser escapada.

for /f tokens^=2^ delims^=^" %%F in ...

Essa mesma técnica é usada para resolver outro problema comum - como usar FOR / F e preservar a linha inteira, independentemente de qual caractere inicia uma determinada linha. O problema é a opção EOL (ponto-e-vírgula por padrão). Para garantir a preservação de toda a linha, o EOL deve ser desativado. Aqui, novamente, as cotas de fechamento são descartadas e os delimitadores de token devem ter escape.

for /f delims^=^ eol^= %%F in ....

DELIMS é definido como nada porque um espaço nunca é incluído na opção DELIMS, a menos que seja a última opção especificada. O próximo caractere de sequência de caracteres da opção após EOL= é considerado como o caractere EOL. Mas neste caso não existe um próximo caractere porque o espaço não é escapado, nem é citado. Portanto, a sintaxe acima desativa DELIMS e EOL.

    
por 03.12.2012 / 22:48
0

Aspas marcam os limites das sequências literais nas quais os metacaracteres não são analisados. Isso inclui caracteres de escape, normalmente o cursor, portanto, a segunda ocorrência das aspas duplas não pode ser ignorada. Geralmente, o símbolo que marcaria o final de uma string literal sempre terminará a string literal.

Se você quiser evitar a análise do "-caractere, você terá que escapar dele com um cursor não-numerado. Infelizmente, a string de opções de opções geralmente tem muitos caracteres que precisam ser salvos e a legibilidade claramente sofre. Sem uso temporário arquivos, o comando seria expandido para:

for /F usebackq^ tokens^=2^ delims^=^" %i in ('findstr /I /R \.cpp\^" MyProj.vcxproj') do @echo %i

Observe que isso não produzirá resultados corretos se o token desejado não for o segundo. Além disso, aninhamento de um loop for e um comando findstr poderia facilmente corrigir isso, mas a sintaxe seria extremamente suja e pode estar além do escopo desta questão.

    
por 04.12.2012 / 00:06