script - powershell tutorial
Cómo dividir comandos largos en varias líneas en PowerShell (6)
¿Cómo se toma un comando como este en PowerShell y se divide en varias líneas?
&"C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe" -verb:sync -source:contentPath="c:/workspace/xxx/master/Build/_PublishedWebsites/xxx.Web" -dest:contentPath="c:/websites/xxx/wwwroot/,computerName=192.168.1.1,username=administrator,password=xxx"
Ah, y si tienes una cadena muy larga que quieras dividir, digamos de html, puedes hacerlo colocando una @
en cada lado de la parte externa "
- como esta:
$mystring = @"
Bob
went
to town
to buy
a fat
pig.
"@
Obtienes exactamente esto: Bob fue a la ciudad a comprar un cerdo gordo.
Y si está usando Notepad ++, incluso se resaltará correctamente como un bloque de cadena. Ahora, si también desea que esa cadena contenga comillas dobles, solo agréguelas, así:
$myvar = "Site"
$mystring = @"
<a href="http://somewhere.com/somelocation">
Bob''s $myvar
</a>
"@
Obtendría exactamente esto:
<a href="http://somewhere.com/somelocation">
Bob''s Site
</a>
Sin embargo, si usa comillas dobles en esa cadena @, Notepad ++ no se da cuenta de eso y cambiará la coloración de la sintaxis como si no estuviera citada o cotizada, según el caso.
Y lo mejor es esto: en cualquier lugar donde insertes una variable $, ¡SÍ se interpreta! (si necesita el signo de dólar en el texto, se le escapa con una marca como esta: `$not-a-variable
¡DARSE CUENTA! Si no coloca el "@
final al principio de la línea , fallará. Me llevó una hora descubrir que no podía sangrar eso en mi código.
Aquí está msdn sobre el tema: http://technet.microsoft.com/library/ee692792.aspx?ppud=4
En PowerShell 5 y PowerShell 5 ISE, también es posible usar simplemente SHIFT+ENTER
para la edición de líneas múltiples (en lugar de las barras estándar `
al final de cada línea):
PS> &"C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe"
>>> -verb:sync
>>> -source:contentPath="c:/workspace/xxx/master/Build/_PublishedWebsites/xxx.Web"
>>> -dest:contentPath="c:/websites/xxx/wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"
Otro método para aprobar un argumento más limpio sería splatting .
Define tus parámetros y valores como una tabla hash como esta:
$params = @{ ''class'' = ''Win32_BIOS'';
''computername''=''SERVER-R2'';
''filter''=''drivetype=3'';
''credential''=''Administrator'' }
Y luego llame a su comando de esta manera:
Get-WmiObject @params
Parece que funciona con Powershell 2.0 y versiones posteriores.
Puede usar el operador de retroceso:
& "C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe" `
-verb:sync `
-source:contentPath="c:/workspace/xxx/master/Build/_PublishedWebsites/xxx.Web" `
-dest:contentPath="c:/websites/xxx/wwwroot/,computerName=192.168.1.1,username=administrator,password=xxx"
Eso todavía es demasiado largo para mi gusto, así que usaría algunas variables bien nombradas:
$msdeployPath = "C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe"
$verbArg = ''-verb:sync''
$sourceArg = ''-source:contentPath="c:/workspace/xxx/master/Build/_PublishedWebsites/xxx.Web"''
$destArg = ''-dest:contentPath="c:/websites/xxx/wwwroot/,computerName=192.168.1.1,username=administrator,password=xxx"''
& $msdeployPath $verbArg $sourceArg $destArg
Si tienes una función
$function:foo | % Invoke @(
''bar''
''directory''
$true
)
Si tienes un Cmdlet
[PSCustomObject] @{
Path = ''bar''
Type = ''directory''
Force = $true
} | New-Item
Si tienes una aplicación
{foo.exe @Args} | % Invoke @(
''bar''
''directory''
$true
)
O
icm {foo.exe @Args} -Args @(
''bar''
''directory''
$true
)
detrás del carácter de la señal hacia atrás
&"C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe" `
-verb:sync `
-source:contentPath="c:/workspace/xxx/master/Build/_PublishedWebsites/xxx.Web" `
-dest:contentPath="c:/websites/xxx/wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"