Как разделить длинные команды на несколько строк в PowerShell - PullRequest
177 голосов
/ 09 апреля 2010

Как взять в 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"

Ответы [ 6 ]

249 голосов
/ 09 апреля 2010

Символ задней косой черты, т. Е.

&"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"
54 голосов
/ 19 июня 2014

Другим методом для более чистой передачи аргументов будет splatting .

Определите ваши параметры и значения в виде хеш-таблицы следующим образом:

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

А затем назовите свой командлет следующим образом:

Get-WmiObject @params

Документы Microsoft: О Splatting

TechNet Magazine 2011: Windows PowerShell: Splatting

Похоже, работает с Powershell 2.0 и выше

36 голосов
/ 23 августа 2012

Ах, и если у вас есть очень длинная строка, которую вы хотите разбить, скажем, HTML, вы можете сделать это, поместив @ с каждой стороны от внешнего " - как это:

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

Вы получите именно это:

Bob
went
to town
to buy
a fat
pig.

А если вы используете Блокнот ++ , он даже будет правильно выделен как строковый блок.

Теперь, если вы хотите, чтобы эта строка также содержала двойные кавычки, просто добавьте их, например, так:

$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»

15 голосов
/ 01 августа 2013

Вы можете использовать оператор 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
9 голосов
/ 12 ноября 2014

Если у вас есть функция:

$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
)
0 голосов
/ 03 февраля 2016

В PowerShell 5 и PowerShell 5 ISE также можно использовать просто Shift + Ввод для многострочного редактирования (вместо стандартных обратных галочек ` в конце каждой строки). ):

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...