pwsh: el comando está eliminando las comillas

Resuelto Chris G. asked hace 4 años • 3 respuestas

En pwsh llama a lo siguiente:

Write-Host '{"drop_attr": "name"}' 

Resultado correcto:

{"drop_attr": "name"}

Ahora haz lo mismo vía pwsh:

pwsh -Command Write-Host '{"drop_attr": "name"}'

¿En el resultado faltan comillas y corchetes?

drop_attr: name
Chris G. avatar Nov 25 '19 23:11 Chris G.
Aceptado

Actualizar :

  • PowerShell 7.3.0 solucionó principalmente el problema, con excepciones selectivas en Windows ; consulte esta respuesta para obtener más detalles.

  • Para códigos de versiones cruzadas y ediciones cruzadas, el Nativemódulo que se analiza en la parte inferior aún puede ser de interés.


Desafortunadamente, el manejo de PowerShell al pasar argumentos con "caracteres incrustados. a programas externos , que incluye la propia CLI de PowerShell ( pwsh), está fundamentalmente roto (y siempre lo ha estado), hasta al menos PowerShell 7.2.x :

Debe \escapar manualmente de "las instancias incrustadas en sus argumentos para que se pasen correctamente a programas externos (que en este caso también es PowerShell):

# Note: The embedded '' sequences are the normal and expected
#       way to escape ' chars. inside a PowerShell '...' string.
#       What is *unexpected* is the need to escape " as \"
#       even though " can normally be used *as-is* inside a '...' string.
pwsh -Command ' ''{\"drop_attr\": \"name\"}'' '

Tenga en cuenta que supongo que su intención es pasar una cadena JSON, de ahí las '' ... ''comillas internas (comillas simples escapadas), lo que garantiza que, pwshen última instancia, se vea una cadena entre comillas simples ( '...'). (No es necesario un comando de salida explícito; PowerShell imprime implícitamente el resultado del comando y la expresión).

Otra forma de demostrar esto en Windows es a través de la choice.exeutilidad estándar, reutilizada para simplemente imprimir su /margumento (mensaje) (seguido textualmente [Y,N]?Y):

# This *should* preserve the ", but doesn't as of v7.2
PS> choice /d Y /t 0 /m '{"drop_attr": "name"}'
{drop_attr: name} [Y,N]?Y      # !! " were REMOVED

# Only the extra \-escaping preserves the "
PS> choice /d Y /t 0 /m '{\"drop_attr\": \"name\"}'
{"drop_attr": "name"} [Y,N]?Y  # OK

Tenga en cuenta que desde dentro de PowerShell, puede evitar la necesidad de \escapar, si llama pwshcon un bloque de secuencia de comandos ( { ... }) , pero eso solo funciona cuando se llama a PowerShell, no a otros programas externos :

# NOTE: Works from PowerShell only.
pwsh -Command { '{"drop_attr": "name"}' }

Información general sobre el manejo incorrecto de argumentos de PowerShell con "llamadas integradas a programas externos , a partir de PowerShell 7.2.1:

  • Esta edición de documentos de GitHub contiene información general.

  • En el número 1995 de GitHub se analiza el problema y en este comentario se resumen los detalles del comportamiento defectuoso, así como las soluciones manuales ; El estado de la discusión a partir de PowerShell [Core] 7 parece ser:

    • [VER ACTUALIZACIÓN EN LA PARTE SUPERIOR] Se está considerando una solución como característica experimental , que puede convertirse en una característica oficial, en la versión 7.3 como muy pronto . Queda por ver si se convertirá en una característica regular, es decir, si el comportamiento predeterminado se arreglará o si la solución requerirá una suscripción voluntaria o incluso si la característica se volverá oficial.

      • Arreglar el comportamiento predeterminado rompería sustancialmente la compatibilidad con versiones anteriores; Al momento de escribir este artículo, esto nunca se ha permitido, pero ha comenzado una discusión sobre si permitir cambios importantes en el futuro y cómo administrarlos: consulte el número 13129 de GitHub .
    • Consulte GitHub PR #14692 para conocer la característica experimental relevante , que, sin embargo, al momento de escribir este artículo, faltan adaptaciones vitales para archivos por lotes y msiexecejecutables de estilo en Windows; consulte el número de GitHub #15143 .

  • Mientras tanto, puede usar la función auxiliar de PSv3+ie desde el Nativemódulo (en PSv5+, instale Install-Module Nativedesde la Galería de PowerShell ), que compensa internamente todo el comportamiento incorrecto y permite pasar argumentos como se espera; por ejemplo,
    ie pwsh -Command ' ''{"drop_attr": "name"}'' 'entonces funcionaría correctamente.
    iees una solución de edición cruzada compatible con versiones posteriores (es decir, también funciona en PowerShell (Core) 7.3+) y también compensa los comportamientos con ciertos tipos de CLI que no se corrigieron en v7.3+.

mklement0 avatar Nov 25 '2019 17:11 mklement0

De otra manera. ¿Estás en Windows o Unix?

pwsh -c "[pscustomobject]@{drop_attr='name'} | convertto-json -compress"

{"drop_attr":"name"}
js2010 avatar Jan 03 '2020 13:01 js2010