web-dev-qa-db-fra.com

Comment fractionner de longues commandes sur plusieurs lignes dans PowerShell

Comment prenez-vous une commande semblable à celle-ci dans PowerShell et divisez-la sur plusieurs lignes?

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

Caractère de fuite arrière, c'est-à-dire

&"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"
259
Colin Pickard

Une autre méthode permettant de passer des arguments plus propres serait éclaboussures .

Définissez vos paramètres et valeurs comme une table de hachage comme ceci:

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

Et appelez ensuite votre commandlet comme ceci:

Get-WmiObject @params

Microsoft Docs: À propos des éclaboussures

TechNet Magazine 2011: Windows PowerShell: Splatting

On dirait que cela fonctionne avec Powershell 2.0 et plus

56
BJHop

Ah, et si vous voulez rompre une très longue chaîne, disons HTML, vous pouvez le faire en mettant un @ de chaque côté de la " extérieure - comme ceci:

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

Vous obtenez exactement ceci:

Bob
went
to town
to buy
a fat
pig.

Et si vous utilisez Notepad ++ , il sera même mis en évidence correctement en tant que bloc de chaîne.

Maintenant, si vous voulez que cette chaîne contienne aussi des guillemets doubles, ajoutez-les simplement, comme ceci:

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

Vous obtiendrez exactement ceci:

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

Toutefois, si vous utilisez des guillemets doubles dans cette chaîne @, Notepad ++ ne s'en rend pas compte et modifie la coloration de la syntaxe comme si elle n'était pas entre guillemets ni entre guillemets, selon le cas.

Et ce qui est mieux, c'est que partout où vous insérez une variable $, elle est interprétée! (Si vous avez besoin du signe dollar dans le texte, vous l’échappez avec une coche comme celle-ci: `` $ not-a-variable`.)

REMARQUER! Si vous ne placez pas le "@ final au tout début de la ligne , cela échouera. Il m'a fallu une heure pour comprendre que je ne pouvais pas l'indenter dans mon code!

Voici MSDN sur le sujet: tilisation de Windows PowerShell "Here-Strings"

36
bgmCoder

Vous pouvez utiliser l'opérateur 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"

C'est encore un peu trop long à mon goût, alors j'utiliserais des variables bien nommées:

$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
17
Aaron Jensen

Si vous avez une fonction:

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

Si vous avez un cmdlet :

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

Si vous avez une application:

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

Ou

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

Dans PowerShell 5 et PowerShell 5 ISE, il est également possible d’utiliser uniquement Shift + Enter pour l'édition multiligne (au lieu des backticks standard ` à la fin de chaque ligne):

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"
1
Bad