Como fazer com que o prompt de comando do Windows trate aspas simples como se fossem aspas duplas?

Como fazer com que o prompt de comando do Windows trate aspas simples como se fossem aspas duplas?

Meu cenário é simples - estou copiando exemplos de script doLivro on-line mercuriale colá-los em um prompt de comando do Windows. O problema é que os exemplos do livro usam strings entre aspas simples. Quando uma string entre aspas simples é passada no prompt de comando do Windows, este ú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 está em um prompt de comando, porque o último trata 'Initial commit'como duas strings - 'Initiale commit'. Tenho que editar o comando depois de colar e isso é chato.

É possível instruir o prompt de comando do Windows para tratar aspas simples de forma semelhante às duplas?

EDITAR

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

  • O ponto de entrada do Mercurial é assim (é um programa python):

    def run():
        "run the command in sys.argv"
        sys.exit(dispatch(request(sys.argv[1:])))
    
  • Então, criei um pequeno 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 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.

Responder1

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

Você ainda pode ter problemas com aspas dentro de aspas. Por exemplo, tenho o Strawberry Perl instalado no meu computador Windows. Quando executo perl -e 'print time, "\n" 'no PowerShell, vejo resultados como 1321375663SCALAR(0x15731d4). Tenho que escapar das aspas duplas para que funcione conforme o esperado:perl -e 'print time, \"\n\" '

Responder2

Primeiro, um prompt de comando não é um interpretador de comandos. (Um prompt de comando é a coisaexibido porum interpretador de comandos.) Em segundo lugar, seu interpretador de comandos, os prompts que ele emite e os consoles Win32 têmnada mesmoa ver com isso.

Nos programas Win32, dividir 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 main()- é o domínio das bibliotecas de tempo de execução desses programas. No Unices e no Linux, o shell faz a divisão de palavras, porque o sistema operacional na verdade funciona em termos de uma matriz de strings de argumentos. Este não é o caso do Win32. No Win32, o próprio sistema operacional opera em termos de umcauda de comando: asolteirostring longa que ainda contém todas as aspas digitadas originalmente na linha de comando. (Láéalgum processamento feito neste comando é finalizado por um interpretador de comandos antes de ser passado para o programa de destino, mas não está relacionado à divisão de palavras.)

No seu caso, a biblioteca de tempo de execução do seu hgprograma está recebendo este comando:

commit -m 'Commit inicial'

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

Esta convenção está incorporada na biblioteca de tempo de execução fornecida com o compilador usado para criar o programa em primeiro lugar. Se quiser alterar a convenção, você terá que vincular novamentecada programa individual que você deseja executar desta formacom uma biblioteca de tempo de execução especial de sua própria criação que também reconhece aspas simples. Claramente, isso é impraticável (a menos que todos sejam programas 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 adequadamente antes de usá-los.

Responder3

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

A única solução 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 aspas duplas. E então copie e cole no DOS a partir daí.

informação relacionada