¿Cómo hacer que el símbolo del sistema de Windows trate las comillas simples como si fueran comillas dobles?

¿Cómo hacer que el símbolo del sistema de Windows trate las comillas simples como si fueran comillas dobles?

Mi escenario es simple: estoy copiando muestras de script delLibro Mercurial en línea.y pegarlos en el símbolo del sistema de Windows. El problema es que los ejemplos del libro utilizan cadenas entre comillas simples. Cuando se pasa una cadena entre comillas simples en el símbolo del sistema de Windows, este último no reconoce que todo lo que está entre comillas simples pertenece a una cadena.

Por ejemplo, el siguiente comando:

hg commit -m 'Initial commit'

no se puede pegar tal cual en un símbolo del sistema, porque este último lo trata 'Initial commit'como dos cadenas: 'Initialy commit'. Tengo que editar el comando después de pegarlo y es molesto.

¿Es posible indicarle al símbolo del sistema de Windows que trate las comillas simples de manera similar a las dobles?

EDITAR

Tras la respuesta de JdeBP, investigué un poco. Aquí está el resumen:

  • El punto de entrada de Mercurial se ve así (es un programa de Python):

    def run():
        "run the command in sys.argv"
        sys.exit(dispatch(request(sys.argv[1:])))
    
  • Entonces, he creado un pequeño programa en Python para imitar el procesamiento de línea de comando utilizado por Mercurial:

    import sys
    print sys.argv[1:]
    
  • Aquí está el registro de la consola 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 ~]$
    
  • Y aquí está el registro respectivo de la consola de 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>
    

Se puede ver claramente que Windows no trata las comillas simples como comillas dobles. Y esta es la esencia de mi pregunta.

Respuesta1

El carácter de comillas no se puede cambiar en el indicador de command.com. Sin embargo, puede utilizar PowerShell, que acepta comillas simples y dobles como caracteres de comillas. Funcionan igual que en los shells de Unix. Es decir, las comillas simples no expanden las variables, mientras que las comillas dobles sí lo hacen.

Es posible que aún tengas problemas con las comillas dentro de comillas. Por ejemplo, tengo Strawberry Perl instalado en mi computadora con Windows. Cuando ejecuto perl -e 'print time, "\n" 'PowerShell, veo resultados como 1321375663SCALAR(0x15731d4). Tengo que escapar de las comillas dobles para que funcione como se esperaba:perl -e 'print time, \"\n\" '

Respuesta2

Primero, un símbolo del sistema no es un intérprete de comandos. (Un símbolo del sistema es la cosamostrado porun intérprete de comandos.) En segundo lugar, su intérprete de comandos, los mensajes que emite y las consolas Win32 tienennada en absolutoque ver con esto.

En los programas Win32, dividir la línea de comando en "palabras" (las cadenas de caracteres multibyte terminadas en NUL que los programas en los lenguajes C y C++ ven como la matriz de argumentos a la que se pasa main()) es competencia de las bibliotecas de tiempo de ejecución de esos programas. En Unices y Linux, el shell divide las palabras, porque el sistema operativo en realidad funciona en términos de una matriz de cadenas de argumentos. Este no es el caso de Win32. En Win32, el propio sistema operativo funciona en términos decola de comando: asolterocadena larga que todavía contiene todas las comillas que se escribieron originalmente en la línea de comando. (Alláesparte del procesamiento realizado en esta cola de comando por un intérprete de comandos antes de pasarlo al programa de destino, pero no está relacionado con la división de palabras).

En su caso, la biblioteca de tiempo de ejecución de su hgprograma recibe este comando tail:

compromiso -m 'Compromiso inicial'

La biblioteca de tiempo de ejecución con la que se compiló ese programa no sabe que usted quiso decir que una comilla simple es un carácter de comillas en blanco, porqueesa no es la convención. Los acuerdos de la convenciónsoloentre comillas dobles (y barras invertidas antes de las comillas dobles).

Esta convención está integrada en la biblioteca de tiempo de ejecución que se proporcionó con el compilador utilizado para crear el programa en primer lugar. Si desea cambiar la convención, deberá volver a vincularcada programa individual que desee ejecutar de esta maneracon una biblioteca de tiempo de ejecución especial creada por usted mismo que también reconoce comillas simples. Claramente esto no es práctico (a menos que todos estos sean programas Cygwin).

Un enfoque mucho más práctico es hacer lo que ya estás haciendo: reconocer que Windows no es Unix y ajustar los ejemplos en consecuencia antes de usarlos.

Respuesta3

Estoy bastante seguro de que no se puede editar la forma en que DOS analiza los comandos. Es inherente a su programación base.

La única solución que se me ocurre para acelerar las cosas es mantener abierta una ventana del Bloc de notas y ejecutar 'Buscar y reemplazar', reemplazando todas las comillas simples por comillas dobles. Y luego copiar y pegar en DOS desde allí.

información relacionada