Как разделить длинные команды на несколько строк в 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

Ответы:


323

Трейлинг-бэкстик, т. Е.

&"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 или выше, см. Github.com/lzybkr/psreadline - обход истории исправлен для многострочных операторов.
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 Magazine 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>

Однако, если вы используете двойные кавычки в этой @ -строке подобным образом, Notepad ++ не осознает этого и будет переключать раскраску синтаксиса, как если бы он не был заключен в кавычки или в кавычки, в зависимости от случая.

И что еще лучше: везде, где вы вставляете переменную $, она интерпретируется! (Если вам нужен знак доллара в тексте, вы можете убрать его с помощью галочки вроде этого: `` $ not-a-variable`.)

ВНИМАНИЕ! Если вы не поставите финал "@в самом начале строки , он потерпит неудачу. Мне потребовался час, чтобы понять, что я не могу сделать отступ в своем коде!

Вот 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
Мне нравятся имена переменных над другими предложениями, потому что это, возможно, самый читаемый вариант для экспертов, не являющихся PowerShell. Если бы я увидел учебное пособие / руководство по настройке, в котором использовались сплаттинги, я был бы полностью потерян в том, что происходит, без подучебника по сплаттингу. Аналогично, обратные пометки кажутся хрупкими и, вероятно, менее известны, чем простые проверенные и истинные переменные 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.