Come dividere i comandi lunghi su più righe in PowerShell


227

Come si prende un comando come il seguente in PowerShell e lo si divide su più righe?

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


Risposte:


322

Carattere di backtick finale, ovvero

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

Lo spazio bianco conta. Il formato richiesto è Space`Enter.


1
Questo sembra spezzare la funzionalità della cronologia dei comandi (freccia su); come ogni riga si presenta come un comando separato. C'è un modo per aggirare questo?
Richard Ev,

2
Se stai utilizzando PowerShell 3 o versione successiva, consulta github.com/lzybkr/psreadline - l'attraversamento della cronologia è stato corretto per le istruzioni multilinea.
x0n

43
È necessario lo spazio davanti al segno di spunta posteriore # imparato-nel modo più duro
Josh Graham,

29
@ josh-graham E NON ci dovrebbe essere spazio (o commento in linea) DOPO il back-tick. # imparato nel modo più duro
RayLuo,

1
I backtick sono fragili (come sopra lo stato dei commenti) e difficili da trovare durante l'analisi o la revisione di un file. La risposta di @StevenPenny è migliore se si desidera semplificare il debug del codice.
mjd2,

67

Un altro metodo per passare argomenti più chiari sarebbe lo splatting .

Definisci i tuoi parametri e valori come una tabella hash come questa:

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

E quindi chiama il tuo commandlet in questo modo:

Get-WmiObject @params

Microsoft Docs: informazioni su Splatting

TechNet Magazine 2011: Windows PowerShell: Splatting

Sembra che funzioni con Powershell 2.0 e versioni successive


5
Questo è meraviglioso! E puoi aggiungere parametri come questo: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder

1
I punti e virgola sono ok ma superflui. Richiesto solo se ci sono più valori per riga.
Jim Birch,

38

Ah, e se hai una stringa molto lunga che vuoi spezzare, diciamo dell'HTML, puoi farlo mettendo un @da ogni lato dell'esterno "- in questo modo:

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

Ottieni esattamente questo:

Bob
went
to town
to buy
a fat
pig.

E se stai usando Notepad ++ , verrà anche evidenziato correttamente come un blocco di stringhe.

Ora, se vuoi che anche quella stringa contenga virgolette doppie, aggiungile semplicemente, in questo modo:

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

Otterresti esattamente questo:

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

Tuttavia, se usi virgolette doppie in quella stringa @ in quel modo, Notepad ++ non se ne rende conto e cambierà la colorazione della sintassi come se non fosse citata o quotata, a seconda del caso.

E la cosa migliore è questa: ovunque inserisci una variabile $, viene interpretata! (Se hai bisogno del simbolo del dollaro nel testo, scappi con un segno di spunta come questo: `` $ non variabile).)

AVVISO! Se non mettete la finale "@alla fin dall'inizio della linea , fallirà. Mi ci è voluta un'ora per capire che non potevo rientrare nel mio codice!

Ecco MSDN sull'argomento: Uso di Windows PowerShell "Here-Strings"


1
Trucco pulito, anche se ho una variabile $ ... sembra non funzionare. Ottengo "il personaggio non è permesso dopo un'intestazione di stringa qui ..."
tofutim l'

Non penso che tu possa spezzare un nome di variabile, solo una stringa.
bgmCoder

19

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

È ancora un po 'troppo lungo per i miei gusti, quindi userei 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

1
Mi piacciono i nomi delle variabili rispetto ad altri suggerimenti perché è probabilmente l'opzione più leggibile per gli esperti non PowerShell. Se vedessi un tutorial / guida all'installazione che utilizzava lo splatting, sarei totalmente perso in quello che sta succedendo senza un sub-tutorial sullo splatting. Allo stesso modo, i backtick sembrano fragili e probabilmente meno noti delle semplici variabili PS provate e vere.
Josh Desmond,

13

Se hai una funzione:

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

Se si dispone di un cmdlet :

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

Se hai un'applicazione:

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

O

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

3

In PowerShell 5 e PowerShell 5 ISE, è anche possibile utilizzare solo Shift+ Enterper l'editing multilinea (anziché i backtick standard `alla fine di ogni riga):

PS> &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" # Shift+Enter
>>> -verb:sync # Shift+Enter
>>> -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" # Shift+Enter
>>> -dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"

0

Metodo Splat con calcoli

Se si sceglie il metodo splat, fare attenzione ai calcoli effettuati utilizzando altri parametri. In pratica, a volte devo prima impostare le variabili e poi creare la tabella hash. Inoltre, il formato non richiede virgolette singole attorno al valore della chiave o al punto e virgola (come menzionato sopra).

Example of a call to a function that creates an Excel spreadsheet

$title = "Cut-off File Processing on $start_date_long_str"
$title_row = 1
$header_row = 2
$data_row_start = 3
$data_row_end = $($data_row_start + $($file_info_array.Count) - 1)

# use parameter hash table to make code more readable
$params = @{
    title = $title
    title_row = $title_row
    header_row = $header_row
    data_row_start = $data_row_start
    data_row_end = $data_row_end
}
$xl_wksht = Create-Excel-Spreadsheet @params

Nota: l'array di file contiene informazioni che influenzeranno il modo in cui viene popolato il foglio di calcolo.


-1

Un altro modo per spezzare una stringa su più righe è inserire un'espressione vuota nel mezzo della stringa e suddividerla su più righe:

stringa di esempio:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

linee spezzate:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.