Як розділити довгі команди на кілька рядків у PowerShell


227

Як взяти в 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"

Дивіться також ... stackoverflow.com/questions/3235850 / ...
SteveC

Відповіді:


322

Трейлінг символу 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"

Білий простір має значення. Необхідний формат є Space`Enter.


1
Здається, це порушує функціонал історії команд (стрілка вгору); як кожен рядок відображається як окрема команда. Чи є шлях до цього?
Річард Єв

2
Якщо ви використовуєте powershell 3 або новішої версії, див.
x0n

43
Місце перед зворотним галочкою потрібно # навчений-важкий шлях
Джош Грем

29
@ josh-graham І НЕ повинно бути місця (або вбудованого коментаря) ПІСЛЯ зворотного галочки. # дізнався-важкий шлях
RayLuo

1
Повернення є крихкими (як зазначено вище у коментарях) і їх важко знайти під час розбору або перегляду файлу. Відповідь @StevenPenny краще, якщо ви хочете простіше відлагодити код.
mjd2

67

Ще одним методом для чистішого передачі аргументів було б бризкання .

Визначте ваші параметри та значення як хешбіл, як це:

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

А потім зателефонуйте командуванні так:

Get-WmiObject @params

Документи Microsoft: Про бризки

Журнал TechNet 2011: Windows PowerShell: Бризки

Схоже, це працює з Powershell 2.0 і вище


5
Це чудово! І ви можете додати такі параметри: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder

1
Крапки з крапками в порядку, але зайві. Потрібно, лише якщо в рядку є кілька значень.
Джима береза

38

Ах, і якщо у вас дуже довгий рядок, який ви хочете розірвати, скажімо, про HTML, ви можете зробити це, поставивши @на кожній стороні зовнішньої "- так:

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

Ви отримуєте саме це:

Bob
went
to town
to buy
a fat
pig.

І якщо ви використовуєте Notepad ++ , він навіть правильно виділиться як блок рядків.

Тепер, якщо ви хотіли, щоб цей рядок також містив подвійні лапки, просто додайте їх, як це:

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

Ви отримаєте саме це:

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

Однак якщо ви використовуєте подвійні лапки у такому @ -string подібному, Notepad ++ цього не усвідомлює, і вимкне синтаксичне забарвлення так, як ніби воно не було цитується чи цитується, залежно від випадку.

І що краще, так це: де б ви не вставили змінну $, вона НЕ трактується! (Якщо вам потрібен знак долара в тексті, ви уникаєте цього галочки таким чином: `` $ not-a-змінний '. "

ПОВІДОМЛЕННЯ! Якщо ви не поставите фінал "@на самому початку рядка , він провалиться. Знадобилося мені годину, щоб зрозуміти, що я не можу це відкласти у своєму коді!

Ось MSDN з цього питання: Використання Windows PowerShell "Here-Strings"


1
Охайний трюк, хоча якщо у мене є змінна $ ... це, здається, не працює. Я отримую "персонаж не дозволений після заголовка рядка тут ..."
tofutim

Я не думаю, що ви можете зламати ім’я змінної, а лише рядок.
bgmCoder

19

Ви можете скористатися оператором 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"

На мій смак це все ще занадто довго, тому я б використав кілька добре названих змінних:

$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

1
Мені подобаються назви змінних в порівнянні з іншими пропозиціями, тому що це, можливо, найбільш читаний варіант для експертів, які не користуються оболонкою. Якби я побачив підручник / посібник із налаштування, який використовував бризки, я був би повністю загублений від того, що відбувається без підручника з бризки. Аналогічно, зворотні погляди здаються крихкими і, ймовірно, менш відомими, ніж прості перевірені та справжні змінні PS.
Джош Десмонд

13

Якщо у вас є функція:

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

Якщо у вас є командлет :

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

Якщо у вас є програма:

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

Або

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

3

У PowerShell 5 та PowerShell 5 ISE також можна використовувати просто Shift+ Enterдля багаторядкового редагування (замість стандартних зворотних посилань `у кінці кожного рядка):

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"

0

Метод сплайта з обчисленнями

Якщо ви вибираєте метод заставки, остерігайтеся розрахунків, які проводяться за допомогою інших параметрів. На практиці іноді мені доводиться спочатку встановлювати змінні, а потім створювати хеш-таблицю. Крім того, для формату не потрібні одиничні лапки навколо значення ключа або крапки з комою (як зазначено вище).

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

Примітка: Масив файлів містить інформацію, яка впливатиме на заповнення електронної таблиці.


-1

Ще один спосіб розбити рядок на кілька рядків - це ввести порожній вираз у середину рядка та розбити його на рядки:

зразок рядка:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

розбито на лінії:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.