Como dividir comandos longos em várias linhas no PowerShell

227

Como você pega um comando como o seguinte no PowerShell e o divide em várias linhas?

&"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"
asgerhallas
fonte
Veja também ... stackoverflow.com/questions/3235850/…
SteveC
Possível duplicata de Como inserir um comando de várias linhas?
22717 Michael Freidgeim

Respostas:

322

Trailing backtick character, ou seja,

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

O espaço em branco é importante. O formato exigido é Space`Enter.

Colin Pickard
fonte
1
Isso parece quebrar a funcionalidade do histórico de comandos (seta para cima); como cada linha aparece como um comando separado. Existe uma maneira de contornar isso?
Richard Ev
2
Se você estiver executando o powershell 3 ou superior, consulte github.com/lzybkr/psreadline - a travessia do histórico é corrigida para instruções com várias linhas.
x0n 06/10/2013
43
O espaço na frente da crase é necessária # aprendeu-a-hard-way
Josh Graham
29
@ Josh-Graham E NÃO deve haver espaço (ou comentário embutido) APÓS o retorno. # aprendeu-a-hard-way
RayLuo
1
Os backticks são frágeis (como no estado dos comentários acima) e difíceis de encontrar ao analisar ou revisar um arquivo. A resposta de @StevenPenny é melhor se você quiser um código de depuração mais fácil.
Mjd2
67

Outro método para a passagem mais limpa de argumentos seria o splatting .

Defina seus parâmetros e valores como uma hashtable como esta:

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

E, em seguida, chame seu commandlet assim:

Get-WmiObject @params

Microsoft Docs: Sobre splatting

TechNet Magazine 2011: Windows PowerShell: Splatting

Parece que funciona com o Powershell 2.0 e superior

BJHop
fonte
5
Isso é maravilhoso! E você pode adicionar parâmetros como este: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder
1
Os pontos e vírgulas estão ok, mas supérfluos. Necessário apenas se houver vários valores por linha.
jim birch
38

Ah, e se você tem uma string muito longa que deseja quebrar, digamos, em HTML, pode fazê-lo colocando um @em cada lado da parte externa "- assim:

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

Você recebe exatamente isso:

Bob
went
to town
to buy
a fat
pig.

E se você estiver usando o Notepad ++ , ele será destacado corretamente como um bloco de string.

Agora, se você também deseja que essa string contenha aspas duplas, basta adicioná-las assim:

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

Você obteria exatamente isso:

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

No entanto, se você usar aspas duplas nessa sequência @, o Notepad ++ não perceberá e alterará a coloração da sintaxe como se não fosse citada ou citada, dependendo do caso.

E o melhor é que: em qualquer lugar que você insere uma variável $, ela é interpretada! (Se você precisar do cifrão no texto, escape-o com uma marca de seleção como esta: `` $ not-a-variable`.)

AVISO PRÉVIO! Se você não colocar a final "@no início da linha , ela falhará. Levei uma hora para descobrir que eu não poderia recuar isso no meu código!

Aqui está o MSDN sobre o assunto: Usando o Windows PowerShell "Here-Strings"

bgmCoder
fonte
1
Bom truque, mas se eu tiver uma variável $ ... parece não funcionar. Recebo "o caractere não é permitido depois de um cabeçalho de string aqui ..."
tofutim
Eu não acho que você pode quebrar um nome de variável, apenas uma string.
precisa saber é o seguinte
19

Você pode usar o operador 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"

Ainda é um pouco longo para o meu gosto, então eu usaria algumas variáveis ​​bem nomeadas:

$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
Aaron Jensen
fonte
1
Eu gosto de nomes de variáveis ​​sobre outras sugestões, porque é possivelmente a opção mais legível para especialistas que não são especialistas em PowerShell. Se eu visse um guia de tutorial / configuração que usava splatting, eu ficaria totalmente perdido no que está acontecendo sem um sub-tutorial sobre splatting. Da mesma forma, os backticks parecem frágeis e provavelmente menos conhecidos do que as simples variáveis ​​experimentadas e verdadeiras do PS.
Josh Desmond
13

Se você tem uma função:

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

Se você possui um cmdlet :

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

Se você tem um aplicativo:

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

Ou

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

No PowerShell 5 e no PowerShell 5 ISE, também é possível usar apenas Shift+ Enterpara edição de várias `linhas (em vez de backticks padrão no final de cada linha):

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"
Ruim
fonte
0

Método Splat com cálculos

Se você escolher o método de splat, tome cuidado com os cálculos feitos com outros parâmetros. Na prática, às vezes tenho que definir variáveis ​​primeiro e depois criar a tabela de hash. Além disso, o formato não requer aspas simples em torno do valor da chave ou do ponto e vírgula (conforme mencionado acima).

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: A matriz de arquivos contém informações que afetarão como a planilha é preenchida.

Marca
fonte
-1

Outra maneira de quebrar uma string em várias linhas é colocar uma expressão vazia no meio da string e quebrá-la em linhas:

sequência de amostra:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

quebrado através das linhas:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
Kirill Yunussov
fonte