Подтвердить что ты не робот

Как разделить длинные команды на несколько строк в PowerShell

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

Ответ 1

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

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

Ответ 2

Еще один метод для более чистой передачи аргументов - это разбрызгивание.

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

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

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

Get-WmiObject @params

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

TechNet Magazine 2011: Windows PowerShell: распространение

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

Ответ 3

Ах, и если у вас есть очень длинная строка, которую вы хотите разбить, скажем, 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 $myvar
</a>
"@

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

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

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

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

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

Вот MSDN на эту тему: Использование Windows PowerShell "Here -string s"

Ответ 4

Вы можете использовать оператор 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

Ответ 5

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

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

Ответ 6

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