¿Cómo puedo escribir/crear un script de PowerShell palabra por palabra, a partir de otro script de PowerShell?
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";
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 rules
analiza 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 incrustar
Para obtener una cadena expandible (interpolación de cadenas), es decir, una cadena en la que se pueden incrustar referencias de variables (por ejemplo,
$var
o${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$var
que 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 .
- Para suprimir selectivamente la expansión , use comillas invertidas para escapar de los
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.
- Nada (excepto los espacios en blanco) debe seguir al delimitador de apertura
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