2010-04-09 21 views
132

Come si fa a prendere un commmand come questo in PowerShell e split su più linee:Come dividere i comandi lunghi su più linee in 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

See anche ... http: //stackoverflow.com/questions/3235850/how-to-enter-a-multi-line-command – SteveC

+0

Possibile duplicato di [Come inserire un comando multilinea?] (https: // stackoverflow .com/questions/3235850/how-to-enter-a-multi-line-command) –

risposta

186

finali carattere di apice inverso cioè

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

Questo sembra interrompere la cronologia dei comandi (freccia su) funzionale lità; come ogni linea si presenta come un comando separato. C'è un modo per aggirare questo? –

+2

Se si utilizza PowerShell 3 o versione successiva, consultare github.com/lzybkr/psreadline - l'attraversamento cronologico è corretto per istruzioni multilinea. – x0n

+13

Lo spazio davanti al segno di spunta posteriore è richiesto # learn-the-hard-way –

29

Ah, e se hai una stringa molto lunga che vuoi separare, per esempio di html, puoi farlo inserendo un su ciascun lato esterno " - come questo:

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

si ottiene esattamente questo: Bob andato in città per comprare un grasso maiale.

E se si utilizza Notepad ++, verrà persino evidenziato correttamente come blocco di stringhe. Ora, se si voleva che stringa per contenere virgolette, anche, semplicemente aggiungerli in, in questo modo:

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

Si potrebbe ottenere esattamente questo:

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

Tuttavia, se si utilizza un doppio le virgolette in quel @ -string come quello, Notepad ++ non si rende conto di ciò e cambieranno la colorazione della sintassi come se non fosse quotata o citata, a seconda dei casi.

E la cosa migliore è questa: ovunque si inserisca una variabile $, essa viene interpretata! (Se avete bisogno il simbolo del dollaro nel testo, a fuggire con un segno di spunta in questo modo:! `$not-a-variable

AVVISO Se non metti la finale "@ al molto all'inizio della riga, fallirà . mi ci sono voluti un'ora per capire che non riuscivo a rientrare che nel mio codice

Ecco MSDN sul tema:! http://technet.microsoft.com/library/ee692792.aspx?ppud=4

+0

Trucchetto pulito, anche se ho una variabile $ ... sembra non funzionare. Ricevo "il carattere non è consentito dopo un'intestazione di stringa qui ..." – tofutim

+0

Non penso che si possa rompere un nome di variabile, solo una stringa. – bgmCoder

13

È possibile utilizzare l'operatore backtick:

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

che è ancora un po 'troppo lungo per i miei gusti, quindi mi piacerebbe utilizzare alcune variabili ben denominate-:

$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

Un altro metodo per una maggiore pulizia di passaggio argomento sarebbe splatting.

Definire i parametri e valori come una tabella hash come questo:

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

E poi chiamare il commandlet in questo modo:

Get-WmiObject @params 

Windows PowerShell: Splatting.

Looks like it works with Powershell 2.0 and up.

+2

Questo è meraviglioso! E puoi aggiungere parametri come questo: '$ params.add ('name', 'Bob Newhart')' https://ramblingcookiemonster.wordpress.com/2014/12/01/powershell-splatting-build-parameters-dynamically/ – bgmCoder

7

Se si dispone di una funzione

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

Se si dispone di un cmdlet

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

Se si dispone di un'applicazione

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

O

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

In PowerShell 5 e PowerShell 5 ISE, è anche possibile usare solo SHIFT+ENTER per la modifica multilinea (anziché backticks normali ` alla fine di ogni riga):

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" 
Problemi correlati