Jak podzielić długie polecenia na wiele wierszy w PowerShell

227

Jak wziąć takie polecenie w programie PowerShell i podzielić je na wiele wierszy?

&"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
źródło
Zobacz także ... stackoverflow.com/questions/3235850/…
SteveC
Możliwy duplikat Jak wprowadzić polecenie wieloliniowe?
Michael Freidgeim

Odpowiedzi:

322

Końcowy znak wstecz, 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"

Biała przestrzeń ma znaczenie. Wymagany format to Space`Enter.

Colin Pickard
źródło
1
Wydaje się, że psuje to historię poleceń (strzałka w górę); ponieważ każda linia pokazuje się jako osobne polecenie. Czy jest na to jakiś sposób?
Richard Ev,
2
Jeśli używasz programu PowerShell 3 lub nowszego, zobacz github.com/lzybkr/psreadline - przeglądanie historii jest naprawione dla instrukcji wielowierszowych.
x0n,
43
Wymagane jest miejsce przed tyknięciem wstecz # wyuczony na
Josh Graham
29
@ josh-graham I NIE powinno być żadnego spacji (ani komentarza w linii) PO zaznaczeniu wstecz. #
learn
1
Wsteczne są kruche (jak stwierdzono powyżej w komentarzach) i trudno je znaleźć podczas analizowania lub przeglądania pliku. Odpowiedź @StevenPenny jest lepsza, jeśli chcesz łatwiej debugować kod.
mjd2
67

Inną metodą czystszego przekazywania argumentów byłoby rozpryskiwanie .

Zdefiniuj swoje parametry i wartości jako tablicę mieszającą taką jak ta:

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

A następnie wywołaj komendę w ten sposób:

Get-WmiObject @params

Dokumenty Microsoft: Informacje o rozpryskiwaniu

Magazyn TechNet 2011: Windows PowerShell: Rozpryskiwanie

Wygląda na to, że działa z Powershell 2.0 i nowszymi wersjami

BJHop
źródło
5
To wspaniale! I możesz dodać takie parametry: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder
1
Średniki są w porządku, ale są zbyteczne. Wymagane tylko, jeśli istnieje wiele wartości w wierszu.
jim brzoza
38

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

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

Otrzymujesz dokładnie to:

Bob
went
to town
to buy
a fat
pig.

A jeśli używasz Notepad ++ , będzie on nawet poprawnie podświetlany jako blok znaków.

Teraz, jeśli chcesz, aby ten ciąg zawierał także podwójne cudzysłowy, po prostu dodaj je w następujący sposób:

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

Otrzymasz dokładnie to:

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

Jeśli jednak użyjesz podwójnych cudzysłowów w takim ciągu @, Notepad ++ nie zdaje sobie z tego sprawy i zmieni kolorowanie składni, tak jakby nie były cytowane ani cytowane, w zależności od przypadku.

A co jest lepsze, to: gdziekolwiek wstawisz zmienną $, zostanie ona zinterpretowana! (Jeśli potrzebujesz znaku dolara w tekście, uciekasz od niego znakiem tak: `` $ not-a-variable`.)

OGŁOSZENIE! Jeśli nie umieścisz finału "@na samym początku linii , zawiedzie. Zajęło mi godzinę, zanim zrozumiałem, że nie mogę tego wciąć w swoim kodzie!

Oto MSDN na ten temat: Używanie „Here-Strings” programu Windows PowerShell

bgmCoder
źródło
1
Dobra sztuczka, chociaż jeśli mam zmienną $ ... wydaje się, że nie działa. Dostaję „znak po nagłówku tutaj nie jest dozwolony ...”
tofutim
Nie sądzę, że możesz złamać nazwę zmiennej, tylko ciąg.
bgmCoder
19

Możesz użyć operatora wstecz:

& "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ę za długo jak na mój gust, więc użyłbym 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
Aaron Jensen
źródło
1
Lubię nazwy zmiennych w porównaniu z innymi sugestiami, ponieważ jest to prawdopodobnie najbardziej czytelna opcja dla ekspertów spoza programu PowerShell. Gdybym zobaczył poradnik / instrukcję konfiguracji, w której używałeś bryzgania, byłbym całkowicie zagubiony w tym, co się dzieje bez podtutoriala o bryzganiu. Podobnie, backtyki wydają się kruche i prawdopodobnie mniej znane niż proste wypróbowane i prawdziwe zmienne PS.
Josh Desmond
13

Jeśli masz funkcję:

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

Jeśli masz polecenie cmdlet :

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

Jeśli masz aplikację:

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

Lub

icm {foo.exe @Args} -Args @(
  'bar'
  'directory'
  $true
)
Steven Penny
źródło
3

W PowerShell 5 i PowerShell 5 ISE można również użyć just Shift+ Enterdo edycji wielowierszowej (zamiast standardowych odwrotnych znaków `na końcu każdej linii):

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"
Zły
źródło
0

Metoda z obliczeniami

Jeśli wybierzesz metodę splat, strzeż się obliczeń wykonanych przy użyciu innych parametrów. W praktyce czasami muszę najpierw ustawić zmienne, a następnie utworzyć tabelę skrótów. Ponadto format nie wymaga pojedynczych cudzysłowów wokół wartości klucza lub średnika (jak wspomniano powyżej).

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

Uwaga: Tablica plików zawiera informacje, które będą miały wpływ na sposób zapełniania arkusza kalkulacyjnego.

znak
źródło
-1

Innym sposobem na podzielenie ciągu na wiele wierszy jest umieszczenie pustego wyrażenia na środku ciągu i podzielenie go na wiersze:

przykładowy ciąg:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

w podziale na linie:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
Kirill Yunussov
źródło