Por que esse comando 'findstr' não funciona como esperado?

2

Eu uso freqüentemente o programa de linha de comando 'findstr' enquanto escrevo software. Isso me ajuda a localizar rapidamente todos os arquivos que contêm uma string específica em um conjunto de subdiretórios. É muito mais rápido usar 'findstr' do que qualquer outra coisa em muitos casos. Hoje me deparei com um problema em que eu queria encontrar a string "> , então executei este comando (o que eu considero ser uma string escapada bastante típica):

findstr /sic:"\">" *

E recebemos esta mensagem de erro oculta: "O nome do arquivo, o nome do diretório ou a sintaxe do rótulo do volume está incorreta."

Alterando para:

findstr /sic:'\">' *

Funciona corretamente. Por que preciso usar aspas simples em vez de aspas duplas? Eu corri centenas (talvez milhares?) De comandos findstr antes onde eu escapei aspas duplas dentro de um empacotador de aspas duplas sem qualquer problema. O que torna essa string de pesquisa específica tão diferente?

    
por CubicleSoft 24.10.2012 / 17:17

2 respostas

6

Existem dois níveis de processamento aqui - primeiro cmd.exe está analisando a linha de comando para determinar se o redirecionamento, etc. precisa acontecer, e depois disso, findstr obtém a linha de comando restante e faz sua própria análise. de acordo com suas próprias regras (na prática, geralmente o mesmo para vários programas).

Esta postagem do blog do MSDN entra em detalhes sobre o assunto.

Parece-me que, como > é um% metacaracterecmd.exe, o que você precisa é o caractere de escape cmd.exe , que é ^ . Por exemplo, este comando funciona para mim:

findstr /sic:"\"^>" *
    
por 24.10.2012 / 17:56
4

O caractere > é usado para redirecionamento e geralmente precisa ser evitado com um acento circunflexo se for parte de uma cadeia literal. Encapsular a string entre aspas evita que os metacaracteres sejam analisados e elimina a necessidade de escape. É por isso que echo ">" e echo ^> imprimem um sinal real maior em vez de tentar redirecionar a saída.

A segunda ocorrência de aspas duplas sempre marca o fim de uma string literal. Não pode ser escapado, porque o cursor não seria analisado como um metacaractere; está entre aspas. Como resultado, ambos echo "">" e echo "^">" tentarão redirecionar a saída, neste caso, para um arquivo inválido.

Na sua primeira linha, findstr /sic:"\">" * , as segundas aspas duplas são interpretadas como o final de uma string literal. O próximo caractere indica uma saída redirecionada. O nome de arquivo seguinte é de fato inválido; o erro lançado é dificilmente enigmático. O restante do argumento intencionado não é visível para o comando findstr, que só executa /sic:"\" . Se você quiser manter aspas duplas, a seguinte sintaxe se comportaria como pretendido: findstr /sic:""^>" * .

    
por 24.10.2012 / 18:37