2010-04-09 12 views
132

¿Cómo se toma una commmand como éste en PowerShell, que se dividió en varias líneas:cómo dividir los comandos largos a través de múltiples líneas en PowerShell

&"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" 
+0

Ver también ... http: //stackoverflow.com/questions/3235850/how-to-enter-a-multi-line-command – SteveC

+0

Posible duplicado de [¿Cómo ingresar un comando de varias líneas?] (https: // stackoverflow .com/questions/3235850/how-to-enter-a-multi-line-command) –

Respuesta

186

arrastran carácter de acento grave es decir

&"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" 
+1

Esto parece romper el historial de comandos (flecha arriba) funcional itia; como cada línea aparece como un comando separado. ¿Hay alguna forma de evitar esto? –

+2

Si está ejecutando PowerShell 3 o superior, consulte github.com/lzybkr/psreadline: se corrige el recorrido de la historia para declaraciones de línea múltiple. – x0n

+13

El espacio delante de la marca de retroceso se requiere # aprendido de la manera difícil –

29

Ah, y si tiene una cadena muy larga que desea dividir, digamos html, puede hacerlo poniendo un @ en cada lado del exterior " - como este:

$mystring = @" 
Bob 
went 
to town 
to buy 
a fat 
pig. 
"@ 

se obtiene exactamente esto: Bob fue a la ciudad para comprar una grasa cerdo.

Y si está usando Notepad ++, incluso se resaltará correctamente como un bloque de cadena. Ahora, si quería esa cadena para contener comillas dobles, también, hay que añadirlas en, por ejemplo:

$myvar = "Site" 
$mystring = @" 
<a href="http://somewhere.com/somelocation"> 
Bob's $myvar 
</a> 
"@ 

Se podría conseguir exactamente esto:

<a href="http://somewhere.com/somelocation"> 
Bob's Site 
</a> 

Sin embargo, si se utiliza doble cita en esa cadena @, Bloc de notas ++ no se da cuenta de eso y cambiará la coloración de sintaxis como si no estuviera citada o cotizada, según el caso.

Y lo mejor es esto: en cualquier lugar donde inserte una variable $, ¡SÍ se interpreta! (Si usted necesita el signo de dólar en el texto, a escapar de ella con una marca como esta: `$not-a-variable

AVISO Si usted no pone la final "@ en el comienzo de la línea, se producirá un error . me tomó una hora para darse cuenta de que no podía sangrar que en mi código

Aquí es MSDN sobre el tema: http://technet.microsoft.com/library/ee692792.aspx?ppud=4

+0

Buen truco, aunque si tengo una variable $ ... parece que no funciona. Me sale "el personaje no está permitido después de un encabezado de cadena aquí ..." – tofutim

+0

No creo que se pueda romper un nombre de variable, solo una cadena. – bgmCoder

13

Usted puede utilizar el operador de comillas invertidas:

& "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" 

que aún está un poco demasiado largo para mi gusto, por lo que haría uso de algunas variables bien llamada:

$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 
37

Otro método para limpiador de paso de argumentos habría splatting.

definir sus parámetros y valores como una tabla hash como esto:

$params = @{ 'class' = 'Win32_BIOS'; 
      'computername'='SERVER-R2'; 
      'filter'='drivetype=3'; 
      'credential'='Administrator' } 

Y luego llame a su commandlet así:

Get-WmiObject @params 

Windows PowerShell: Splatting.

Looks like it works with Powershell 2.0 and up.

+2

¡Esto es maravilloso! Y puede agregar parámetros como este: '$ params.add ('nombre', 'Bob Newhart')' https://ramblingcookiemonster.wordpress.com/2014/12/01/powershell-splatting-build-parameters-dynamically/ – bgmCoder

7

Si tienes una función

$function:foo | % Invoke @(
    'bar' 
    'directory' 
    $true 
) 

Si usted tiene un cmdlet

[PSCustomObject] @{ 
    Path = 'bar' 
    Type = 'directory' 
    Force = $true 
} | New-Item 

Si usted tiene una aplicación

{foo.exe @Args} | % Invoke @(
    'bar' 
    'directory' 
    $true 
) 

O

icm {foo.exe @Args} -Args @(
    'bar' 
    'directory' 
    $true 
) 
1

En PowerShell 5 y PowerShell 5 ISE, también es posible utilizar solo SHIFT+ENTER para la edición de varias líneas (en lugar de acentos abiertos 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" 
Cuestiones relacionadas