Hoe lange commando’s over meerdere regels te verdelen in PowerShell

Hoe neem je een commando zoals het volgende in PowerShell en verdeel je het over meerdere regels?

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

Antwoord 1, autoriteit 100%

Trailing backtick-teken, d.w.z.

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

Witruimte is belangrijk. Het vereiste formaat is Space`Enter.


Antwoord 2, autoriteit 19%

Een andere methode voor het helderder doorgeven van argumenten is spatten.

Definieer uw parameters en waarden als een hashtabel als volgt:

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

En noem je commandlet dan zo:

Get-WmiObject @params

Microsoft Docs: Over splatting

TechNet Magazine 2011: Windows PowerShell: splatting

Het lijkt erop dat het werkt met Powershell 2.0 en hoger


Antwoord 3, autoriteit 11%

Ah, en als je een hele lange string hebt die je wilt opbreken, bijvoorbeeld HTML, dan kun je dat doen door een @aan elke kant van de buitenste "– zoals dit:

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

Je krijgt precies dit:

Bob
went
to town
to buy
a fat
pig.

En als u Notepad++gebruikt, wordt het zelfs correct gemarkeerd als een tekenreeksblok.

Als je wilt dat die tekenreeks ook dubbele aanhalingstekens bevat, voeg ze dan gewoon toe, zoals dit:

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

Je zou precies dit krijgen:

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

Als je echter op die manier dubbele aanhalingstekens in die @-tekenreeks gebruikt, realiseert Notepad++ zich dat niet en schakelt de syntaxiskleuring uit alsof deze niet tussen aanhalingstekens of tussen aanhalingstekens staat, afhankelijk van het geval.

En wat nog beter is: overal waar je een $variabele invoegt, wordt deze WEL geïnterpreteerd! (Als je het dollarteken in de tekst nodig hebt, ontsnap je eraan met een vinkje als volgt: “$not-a-variable`.)

LET OP! Als je de laatste "@niet aan het helemaal begin van de regelplaatst, zal het mislukken. Het kostte me een uur om erachter te komen dat ik dat niet kon laten inspringen in mijn code!

Hier is MSDNover het onderwerp: Windows PowerShell “Here-Strings” gebruiken


Antwoord 4, autoriteit 5%

U kunt de backtick-operator gebruiken:

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

Dat is nog steeds een beetje te lang naar mijn smaak, dus ik zou wat goed benoemde variabelen gebruiken:

$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

Antwoord 5, autoriteit 4%

Als je een functie hebt:

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

Als u een cmdletheeft:

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

Als je een aanvraag hebt:

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

Of

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

Antwoord 6

In PowerShell 5 en PowerShell 5 ISE is het ook mogelijk om gewoon Shift+ Enterte gebruiken voor bewerking van meerdere regels (in plaats van standaard backticks `aan het einde van elke regel):

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"

Antwoord 7

Een andere manier om een ​​tekenreeks over meerdere regels heen te breken, is door een lege uitdrukking in het midden van de tekenreeks te plaatsen en deze over meerdere regels te verdelen:

voorbeeldreeks:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

doorbroken over lijnen:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"

Antwoord 8

Splatmethode met berekeningen

Als u de splat-methode kiest, pas dan op voor berekeningen die met andere parameters worden gemaakt. In de praktijk moet ik soms eerst variabelen instellen en vervolgens de hashtabel maken. Het formaat vereist ook geen enkele aanhalingstekens rond de sleutelwaarde of de puntkomma (zoals hierboven vermeld).

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

Opmerking: de bestandsarray bevat informatie die van invloed is op hoe de spreadsheet wordt ingevuld.

Other episodes