2013-02-20 16 views
5

Tôi đang viết kịch bản lệnh PowerShell chung để thực hiện triển khai trên các máy từ xa. Tôi đã trúng một vấn đề tôi không thể bị tàn phá, và vấn đề này là với các thông số với dấu ngoặc kép trong Scriptblock đi ngang qua ArgumentListCác tham số có dấu ngoặc kép không được chuyển tới Scriptblock bởi ArgumentList

Tôi có một cái gì đó như thế này:

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @(`"“package - one - external"`", `"“package - two - external"`", `"“package - three - internal"`") 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) & $deployCmd -package:$deployPackage -action:doit } -ArgumentList $deploymentCommand,$deploymentPackage 
} 

Tôi đã thêm dấu ngoặc kép trong $ deploymentPackages. Và vẫn còn tôi nhận được lệnh của tôi thực hiện remotly như thế này (trong đó tất nhiên không):

D:\some path\Command.exe -package:package - one - external -action:doit 
D:\some path\Command.exe -package:package - two - external -action:doit 
D:\some path\Command.exe -package:package - three - external -action:doit 

trong khi con đường thực hiện đúng đắn nên là:

D:\some path\Command.exe -package:"package - three - external" -action:doit 

mà không cần dấu ngoặc kép quanh gói - một - bên ngoài mà lộn xộn up everythig

Làm thế nào để khắc phục vấn đề này, bởi vì tôi đã kiểm tra số lượng các giải pháp và không phải của họ làm việc.

Cảm ơn bạn đã trợ giúp trước!

Trả lời

5

Bạn có thể làm một cái gì đó như thế này

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @('package - one - external', 'package - two - external', 'package - three - internal') 
$remoteScript = { 
    param($deployCmd, $deployPackage) 
    & $deployCmd "-package:$deployPackage" -action:doit 
} 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock $remoteScript -ArgumentList $deploymentCommand,$deploymentPackage 
} 

này bó -package:<some string here> vào một cuộc tranh luận duy nhất khi truyền cho thực thi của bạn, mà là giống như làm một cái gì đó giống như -package:"aaa bbb ccc" trong cmd.exe.

tôi giả sử bạn không muốn dấu ngoặc kép đen truyền cho exe, chỉ dành riêng cho -package:<some string here> là một đối số duy nhất không phân biệt khoảng trống trong <some string here>

Nếu bạn muốn dấu ngoặc kép đen để được thông qua vào exe, sử dụng trên mã với

& $deployCmd "-package:`"$deployPackage`"" -action:doit 
+0

Giải pháp này làm việc một cách hoàn hảo. Cảm ơn! – Midi

1

Hãy thử sử dụng dấu nháy đơn xung quanh chuỗi có dấu ngoặc kép. Tôi đơn giản hóa kịch bản một chút để chỉ viết chuỗi thay vì chạy nó.

$remoteAddress = "some-pc"; 
$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"'); 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock { 
     param ($deploymentPackage) write-host ("-package:{0} -action:doit" -f $deploymentPackage); 
    } -ArgumentList $deploymentPackage; 
} 
8

Bạn có thể sửa lỗi này bằng cách sử dụng dấu nháy đơn để bọc các chuỗi của bạn. Với dấu ngoặc đơn, nội dung giữa các dấu ngoặc kép sẽ bị ảnh hưởng (các biến sẽ không mở rộng và các dấu hiệu như dấu ngoặc kép sẽ được giữ lại). Ví dụ.

PS > '"this is a test"' 
"this is a test" 

Vì vậy, để sửa chữa kịch bản của bạn, hãy thử thay thế mảng deploymentpackages của bạn với điều này:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"') 
1

Sử dụng """. Ví dụ:

$Var = "One" 

$Var sẽ hiển thị One.

Trong khi """$Var""" sẽ hiển thị One