PowerShell Ejecutar una función dentro de un Bloque de Script usando Start-Process hace cosas raras con comillas dobles

Tengo un script de PowerShell que edita el registro, por lo que debe ejecutarse como administrador. Para hacer esto, inicio un nuevo proceso de PowerShell desde mi script de PowerShell en ejecución, y paso parte de la ruta de la clave del registro usando un Bloque de script con una función. Cuando uso comillas dobles dentro de esa función, PowerShell intenta interpretarlas como comandos, en lugar de una cadena. Sin embargo, si uso comillas simples, entonces todo funciona bien.

He creado un pequeño script de muestra de PowerShell que reproduce el problema. Aquí está el fragmento:

$ScriptBlock = {
    function Test
    {
        $status = "This is a string"
        Write-Output $status
    }
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"

Entonces, en el nuevo proceso de PowerShell, primero definirá el código en el bloque de secuencia de comandos y luego llamará al método de prueba, y produce este error:

Esto: el término 'Esto' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa operable. Verifique la ortografía del nombre, o si se incluyó una ruta, verifique que la ruta sea correcta e intente nuevamente.

Así que está tratando de tratar la cadena como una coma, como si acabara de escribirThis is a string solo en una nueva línea en mi guión.

Si cambio la linea

$status = "This is a string"

a

$status = 'This is a string'

el script funciona como se espera y simplemente genera la cadenaThis is a string.

Otro problema extraño que he notado es que si no uso una variable y solo uso:

Write-Output "This is a string"

luego genera cada palabra en una línea separada como esta:

Esta

es

a

cuerda

pero si uso comillas simples como esta:

Write-Output 'This is a string'

luego genera la oración completa en una línea como se esperaba.

¿Alguien sabe por qué PowerShell se comporta de manera extraña en estas situaciones?

Responder

Entonces, como menciona TessellatingHeckler, la solución es envolver todo lo que se cita entre comillas dobles, comillas simples, o puede usar corchetes.

Entonces, en mi ejemplo, cambiarías:

$status = "This is a string"

a esto:

$status = """This is a string"""

o esto:

$status = '"This is a string"'

o esto:

$status = {"This is a string"}

Sin embargo, si desea evaluar una variable en su cadena (es decir, ver el valor de la variable), debe usar el método de comillas dobles:

$status = """This is a string that evaluates $someVariable"""

Todavía no estoy seguro de si se trata de un error o por diseño, pero al menos tenemos una solución, ya que esto soluciona los dos problemas que describí anteriormente.

Respuestas a la pregunta(1)

Su respuesta a la pregunta