2010-04-09 66 views
132

Làm thế nào để bạn có một commmand như thế này trong PowerShell và chia nó trên nhiều dòng:Làm thế nào để tách các lệnh dài trên nhiều dòng trong 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" 
+0

Xem cũng ... http: //stackoverflow.com/questions/3235850/how-to-enter-a-multi-line-command – SteveC

+0

Bản sao có thể có của [Cách nhập lệnh nhiều dòng?] (https: // stackoverflow .com/questions/3235850/how-to-enter-a-multi-line-command) –

Trả lời

186

trailing nhân vật backtick tức

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

Điều này dường như phá vỡ lịch sử lệnh (mũi tên lên) chức năng ity; vì mỗi dòng xuất hiện dưới dạng một lệnh riêng biệt. Có cách nào để giái quyết vấn đề này không? –

+2

Nếu bạn đang chạy PowerShell 3 hoặc cao hơn, hãy xem github.com/lzybkr/psreadline - traversal lịch sử được cố định cho các câu lệnh nhiều dòng. – x0n

+13

Không gian ở phía trước của dấu kiểm được yêu cầu # học-cách-cứng-cách –

29

Ah, và nếu bạn có một chuỗi rất dài mà bạn muốn chia nhỏ, hãy nói html, bạn có thể làm điều đó bằng cách đặt @ trên mỗi bên của bên ngoài " - như sau:

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

Bạn nhận được chính xác này: Bob đi đến thị trấn để mua một chất béo lợn.

Và nếu bạn đang sử dụng Notepad ++, nó thậm chí sẽ làm nổi bật chính xác như một khối chuỗi. Bây giờ, nếu bạn muốn chuỗi để chứa dấu ngoặc kép, quá, chỉ cần thêm chúng vào, như thế này:

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

Bạn sẽ nhận được chính xác này:

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

Tuy nhiên, nếu bạn sử dụng đôi báo giá trong đó @ -string như thế, Notepad ++ không nhận ra điều đó và sẽ chuyển đổi màu cú pháp như thể nó không được trích dẫn hoặc trích dẫn, tùy thuộc vào từng trường hợp.

Và điều tốt hơn là điều này: bất cứ nơi nào bạn chèn biến $, nó sẽ được giải thích! (Nếu bạn cần các ký hiệu đô la trong văn bản, bạn thoát khỏi nó với một dấu tick như thế này:! `$not-a-variable

THÔNG BÁO Nếu bạn không đưa trận chung kết "@ tại rất bắt đầu của dòng, nó sẽ thất bại . tôi đã mất một giờ để tìm ra rằng tôi không thể thụt rằng trong mã của tôi

đây là MSDN về đề tài này: http://technet.microsoft.com/library/ee692792.aspx?ppud=4

+0

Bí quyết gọn gàng, mặc dù nếu tôi có biến $ ... có vẻ như nó không hoạt động. Tôi nhận được "các ký tự không được phép sau khi một tiêu đề chuỗi ở đây ..." – tofutim

+0

Tôi không nghĩ rằng bạn có thể phá vỡ một tên biến, chỉ là một chuỗi. – bgmCoder

13

Bạn có thể sử dụng toán tử 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" 
.210

Đó là vẫn còn một chút quá dài cho hương vị của tôi, vì vậy tôi muốn sử dụng một số biến nổi tên:

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

Một phương pháp cho tranh luận qua sạch sẽ splatting.

Xác định các thông số và giá trị của bạn như một Hashtable như thế này:

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

Và sau đó gọi commandlet của bạn như thế này:

Get-WmiObject @params 

Windows PowerShell: Splatting.

Looks like it works with Powershell 2.0 and up.

+2

Điều này thật tuyệt vời! VÀ bạn có thể thêm các tham số như sau: '$ params.add ('name', 'Bob Newhart')' https://ramblingcookiemonster.wordpress.com/2014/12/01/powershell-splatting-build-parameters-dynamically/ – bgmCoder

7

Nếu bạn có một chức năng

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

Nếu bạn có một lệnh

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

Nếu bạn có một ứng dụng

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

Hoặc

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

Trong PowerShell 5 và PowerShell 5 ISE, nó cũng có thể sử dụng chỉ SHIFT+ENTER để chỉnh sửa nhiều dòng (thay vì backticks chuẩn ` vào cuối mỗi dòng):

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" 
Các vấn đề liên quan