¿Cómo puedo escribir/crear un script de PowerShell palabra por palabra, a partir de otro script de PowerShell?

Resuelto Bbb asked hace 5 años • 0 respuestas

El siguiente código (en la parte inferior) produce uno de los siguientes resultados en el archivo

4/12/2019 = (get-date).AddDays(2).ToShortDateString();
4/13/2019 = (get-date).AddDays(2 + 1).ToShortDateString();

o si no he inicializado la variable

 = (get-date).AddDays(2).ToShortDateString();
 = (get-date).AddDays(2 + 1).ToShortDateString();

Este es el bloque de código. Me gustaría que el archivo ps1 principal escriba el archivo ps1 secundario palabra por palabra.

$multiLineScript2 = @"

    $startDate2 = (get-date).AddDays($resultOfSubtraction).ToShortDateString();
    $endDate2 = (get-date).AddDays($resultOfSubtraction + 1).ToShortDateString();
"@

$multiLineScript2 | Out-File "c:\file2.ps1";
Bbb avatar Apr 10 '19 19:04 Bbb
Aceptado

tl;dr :

Para crear una cadena textual de varias líneas (es decir, una cadena con contenido literal ), utilice una cadena aquí entre comillas simples :

$multiLineScript2 = @'

    $startDate2 = (get-date).AddDays($resultOfSubtraction).ToShortDateString();
    $endDate2 = (get-date).AddDays($resultOfSubtraction + 1).ToShortDateString();
'@

Tenga en cuenta el uso de @'y '@como delimitadores.

Utilice una cadena aquí entre comillas dobles sólo si se necesita expansión de cadena (interpolación) ; para suprimir selectivamente la expansión, escapar $de los caracteres. debe incluirse palabra por palabra como`$ , como se muestra en su propia respuesta .


Literales de cadena en PowerShell

Get-Help about_quoting rulesanaliza los tipos de literales de cadena admitidos por PowerShell :

  • Para obtener una cadena con contenido literal (sin interpolación, lo que C# llamaría una cadena textual ), use comillas simples :'...'

    • Para incrustar 'caracteres. dentro de una '...'cadena, duplicarlos ( ''); todos los demás caracteres. se puede utilizar tal cual.
  • Para obtener una cadena expandible (interpolación de cadenas), es decir, una cadena en la que se pueden incrustar referencias de variables (por ejemplo, $varo ${var}) y expresiones (por ejemplo, ) que se reemplazan con sus valores, utilice comillas dobles :$($var.Name)"..."

    • Para suprimir selectivamente la expansión , use comillas invertidas para escapar de los $caracteres.; por ejemplo, para evitar $varque se interpola (expandir a su valor) dentro de una "..."cadena, utilice `$var; para insertar una comilla invertida literal, utilice``
    • Para obtener una descripción general de las reglas de expansión de cadenas, consulte esta respuesta .

Ambos tipos fundamentales también están disponibles como cadenas aquí , en los formularios @'<newline>...<newline>'@y @"<newline>...<newline>"@respectivamente ( <newline>significa una nueva línea real (salto de línea)), lo que facilita la definición de cadenas de varias líneas .

  • Importante :
    • Nada (excepto los espacios en blanco) debe seguir al delimitador de apertura@' o @", en la misma línea, el contenido de la cadena debe definirse en las líneas siguientes .
    • El delimitador de cierre'@ , o "@(que coincida con el delimitador de apertura), debe estar al principio de una línea .
    • Las cadenas aquí definidas en archivos usan invariablemente el formato de nueva línea del archivo adjunto (CRLF vs. LF), mientras que las definidas interactivamente siempre usan solo LF.

Ejemplos:

# Single-quoted: literal:
PS> 'I am $HOME'
I am $HOME

# Double-quoted: expandable
PS> "I am $HOME"
I am C:\Users\jdoe

# Here-strings:

# Literal
PS> @'
I am
  $HOME
'@
I am
  $HOME

# Expandable
PS> @"
I am
  $HOME
"@
I am
  C:\Users\jdoe
mklement0 avatar Apr 10 '2019 13:04 mklement0