2010-04-09 9 views
132

Skąd wziąć commmand jak to w PowerShell i podzielić ją na wielu liniach:Jak podzielić długich poleceń na wielu liniach w 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

Apostolskiej również ... http: //stackoverflow.com/questions/3235850/how-to-enter-a-multi-line-command – SteveC

+0

Możliwy duplikat [Jak wprowadzić polecenie wieloliniowe?] (https: // stackoverflow .com/questions/3235850/how-to-enter-a-multi-line-command) –

Odpowiedz

186

spływu charakter grawis tj

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

To wydaje się łamać historię poleceń (strzałka w górę) funkcjonalne ity; ponieważ każda linia pojawia się jako osobne polecenie. Czy istnieje sposób obejścia tego? –

+2

Jeśli używasz powłoki Power Shell 3 lub wyższej, zobacz github.com/lzybkr/psreadline - przechodzenie historii jest ustalone dla wyciągów wielowierszowych. – x0n

+13

Wymagana jest przestrzeń przed tyłem-tyłki # uczona-trudna droga –

29

Ah, a jeśli masz bardzo długi ciąg, który chcesz zepsuć, powiedzmy o html, możesz to zrobić, wstawiając @ po każdej stronie zewnętrznej " - w ten sposób:

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

dostać dokładnie to: Bob poszedł do miasta kupić tłuszczu świnię.

A jeśli używasz Notepad ++, to będzie on podświetlany poprawnie jako blok ciągów znaków. Teraz, jeśli chciał, że ciąg zawiera cudzysłów też po prostu dodać je w następujący sposób:

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

Można by uzyskać dokładnie to:

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

Jednak jeśli używasz podwójnie Cytaty w tym @ -stringu w ten sposób, Notepad ++ nie zdaje sobie z tego sprawy i zmieni kolorowanie składni tak, jakby nie było cytowane lub cytowane, w zależności od przypadku.

Co jest lepsze: wszędzie wstawiasz zmienną $, TO interpretuje się! (Jeśli trzeba znak dolara w tekście, można uciec się ze znakiem kleszcza jak ten: `$not-a-variable

OGŁOSZENIA Jeśli nie umieścić ostateczną "@ na samego początku linii, to nie . zajęło mi to godzinę, aby dowiedzieć się, że nie mogę wciąć że w moim kodu

Oto MSDN na temat: http://technet.microsoft.com/library/ee692792.aspx?ppud=4

+0

Schludny trik, chociaż jeśli mam zmienną $ ... to wydaje się nie działać. Dostaję "znak nie jest dozwolony po tym nagłówku nagłówka ..." – tofutim

+0

Nie sądzę, że można złamać nazwę zmiennej, tylko ciąg znaków. – bgmCoder

13

można użyć operatora grawis:

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

To wciąż trochę zbyt długo jak na mój gust, więc użyję kilka dobrze nazwanych zmiennych:

$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

Inną metodą czystszego przemijania argumentu byłoby splatting.

Określ swoje parametry i wartości jako hashtable tak:

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

a następnie wezwać commandlet tak:

Get-WmiObject @params 

Windows PowerShell: Splatting.

Looks like it works with Powershell 2.0 and up.

+2

To jest cudowne! I możesz dodać parametry takie jak to: '$ params.add ('name', 'Bob Newhart')' https://ramblingcookiemonster.wordpress.com/2014/12/01/powershell-splatting-build-parameters-dynamically/ – bgmCoder

7

Jeśli masz funkcji

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

Jeśli masz komandletu

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

Jeśli masz aplikację

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

Albo

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

W PowerShell 5 i PowerShell 5 ISE, możliwe jest również użycie tylko SHIFT+ENTER dla wielowierszowego edycji (zamiast standardowych odwrócone, pojedyncze apostrofy ` na końcu każdej linii):

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" 
Powiązane problemy