Como fazer com que o comando do Windows consiga tratar aspas simples como se fossem aspas duplas?

5

Meu cenário é simples - estou copiando amostras de script do livro on-line do Mercurial e colando-as em um prompt de comando do Windows. O problema é que as amostras no livro usam strings entre aspas simples. Quando uma única string entre aspas é passada no prompt de comando do Windows, o último não reconhece que tudo entre aspas simples pertence a uma string.

Por exemplo, o seguinte comando:

hg commit -m 'Initial commit'

não pode ser colado como em um prompt de comando, porque o último trata 'Initial commit' como duas sequências - 'Initial e commit' . Eu tenho que editar o comando depois de colar e é irritante.

É possível instruir o prompt de comando do Windows para tratar aspas simples de maneira similar à dupla?

EDITAR

Após a resposta do JdeBP, fiz uma pequena pesquisa. Aqui está o resumo:

  • O ponto de entrada do Mercurial parece com isso (é um programa python):

    def run():
        "run the command in sys.argv"
        sys.exit(dispatch(request(sys.argv[1:])))
    
  • Então, eu criei um minúsculo programa python para imitar o processamento de linha de comando usado pelo mercurial:

    import sys
    print sys.argv[1:]
    
  • Aqui está o log do console do Unix:

    [hg@Quake ~]$ python 1.py  "1 2 3"
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  '1 2 3'
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  1 2 3
    ['1', '2', '3']
    [hg@Quake ~]$
    
  • E aqui está o respectivo log do console do Windows:

    C:\Work>python 1.py  "1 2 3"
    ['1 2 3']
    
    C:\Work>python 1.py  '1 2 3'
    ["'1", '2', "3'"]
    
    C:\Work>python 1.py  1 2 3
    ['1', '2', '3']
    
    C:\Work>
    

Pode-se ver claramente que o Windows não trata aspas simples como aspas duplas. E esta é a essência da minha pergunta.

    
por mark 17.08.2011 / 13:05

3 respostas

6

O caractere de citação não pode ser alterado no prompt command.com. Você pode, no entanto, usar o PowerShell, que aceita aspas simples e duplas como caracteres de cotação. Eles funcionam da mesma forma que em shells Unix. Ou seja, aspas simples não expandem as variáveis, enquanto as aspas duplas irão.

Você ainda pode ter problemas com citações entre aspas. Por exemplo, eu tenho morango perl instalado no meu computador com Windows. Quando executo perl -e 'print time, "\n" ' no PowerShell, vejo a saída como 1321375663SCALAR(0x15731d4) . Eu tenho que escapar as aspas duplas para que ele funcione como esperado: perl -e 'print time, \"\n\" '

    
por 15.11.2011 / 17:52
1

Primeiro, um prompt de comando não é um interpretador de comandos. ( Um prompt de comando é a coisa exibida por um interpretador de comandos. ) Em segundo lugar, seu interpretador de comandos, os avisos que ele emite e os consoles do Win32, não têm nada para fazer isso.

Nos programas Win32, dividindo a linha de comando em "palavras" - as cadeias de caracteres multibyte terminadas em NUL que os programas nas linguagens C e C ++ veem como a matriz de argumentos passada para main() - é a província da bibliotecas de tempo de execução desses programas. No Unices e Linux, o shell faz a divisão de palavras, porque o sistema operacional realmente funciona em termos de um array de string de argumento. Este não é o caso do Win32. No Win32, o próprio sistema operacional opera em termos de cauda de comando : uma única cadeia longa que ainda contém todas as aspas originalmente digitadas na linha de comando. (Existe algum processamento feito para este comando por um interpretador de comandos antes de ser passado para o programa alvo, mas não está relacionado com a divisão de palavras.)

No seu caso, a biblioteca de tempo de execução para o seu programa hg está sendo entregue nesta linha de comando:

commit -m 'Initial commit'

A biblioteca de tempo de execução com a qual o programa foi compilado não sabe que você quis dizer uma aspa simples para ser um caractere de aspas em branco, porque não é a convenção . A convenção trata apenas entre aspas duplas (e barras invertidas antes das aspas duplas).

Essa convenção é embutida na biblioteca de tempo de execução que foi fornecida com o compilador usado para criar o programa em primeiro lugar. Se você quiser mudar a convenção, você terá que re-linkar cada programa individual que você quer rodar desta forma com uma biblioteca especial de tempo de execução criada por você e que também reconheça as aspas simples. Claramente isso é impraticável (a menos que sejam todos os programas do Cygwin).

Uma abordagem muito mais prática é fazer o que você já está fazendo: reconhecer que o Windows não é Unix e ajustar os exemplos de acordo antes de usá-los.

    
por 27.08.2011 / 14:35
0

Tenho certeza de que você não pode editar a maneira como o DOS analisa comandos. É inerente à programação básica.

A única solução em que consigo pensar para acelerar as coisas é manter uma janela do Bloco de Notas aberta e executar um 'Localizar e Substituir' - substituindo todas as aspas simples por entre aspas duplas. E então copiar e colar no DOS de lá.

    
por 17.08.2011 / 13:17