2013-02-20 10 views
5

Piszę ogólny skrypt powershell, aby wykonać wdrożenia na komputerach zdalnych. I uderzył jeden problem, nie mogę przekręcić, a ten problem jest z parametrami z cudzysłowy w Scriptblock przekazywanych przez ArgumentListParametry z podwójnymi cudzysłowami nie są poprawnie przesyłane do Scriptblock przez ArgumentList

mam coś takiego:

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

Dodałem cudzysłowów w $ deploymentPackages. I wciąż dostaję moje polecenia wykonywane zdalnie tak (co oczywiście nie):

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 

natomiast właściwa ścieżka wykonanie powinno być:

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

bez cudzysłowów wokół pakietu - One - zewnętrzne, które bałagan do góry co to jest

Jak pokonać ten problem, ponieważ przetestowałem wiele rozwiązań i nie działało.

Dzięki za pomoc z góry!

Odpowiedz

5

Można zrobić coś takiego

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

-package:<some string here> ten skupia wszystkie w jednym argumentem, gdy przeszedł do swojego pliku wykonywalnego, który jest taki sam jak robi coś podobnego -package:"aaa bbb ccc" w cmd.exe.

Zakładam, że nie chcesz dosłownych cytatów przekazywanych do exe, tylko dla -package:<some string here> być pojedynczy argument niezależnie od przestrzeni w <some string here>

Jeśli chcesz dosłowne cytaty mają być przekazywane do EXE, użyj powyższego kod z

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

To rozwiązanie działało idealnie. Dzięki! – Midi

1

Spróbuj użyć pojedynczych cudzysłowów wokół napisu z podwójnymi cudzysłowami. Uproszyłem skrypt trochę, aby napisać ciąg zamiast go uruchamiać.

$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

Możesz to naprawić, używając pojedynczych cudzysłowów do zawijania łańcuchów. W przypadku pojedynczych cudzysłowów zawartość między cudzysłowami będzie nietknięta (zmienne nie będą się rozszerzać, a znaki takie jak cudzysłowy będą zachowane). Na przykład.

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

Tak, aby naprawić swój scenariusz, spróbuj wymienić swoją tablicę deploymentpackages z tym:

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

Korzystając """. Na przykład,

$Var = "One" 

$Var wyświetli One.

Podczas """$Var""" wyświetli One

Powiązane problemy