Jak prawidłowo usunąć cudzysłowy w -param
wartości w następującym wierszu poleceń?
$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd
To oczywiście zawodzi. Próbowałem uniknąć cudzysłowów (pojedynczych i podwójnych), używając znaku ucieczki `i wykonałem różne kombinacje, ale nic nie działa.
powershell-2.0
eetawil
źródło
źródło
$someCommandStringWithDoubleQuotes | cmd
. To faktycznie działa ze skryptów PowerShell (np. Wywołanie CMake (co wymaga podwójnych cudzysłowów (w przeciwnym razie po cichu zakończy się niepowodzeniem))). Alternatywą dla CMD jest bash.exe ( MinGW ) - ale w niektórych okolicznościach może się on uruchamiać bardzo, bardzo wolno.Odpowiedzi:
Ucieczka przed parametrami jest zwykle źródłem frustracji i sprawia wrażenie straconego czasu. Widzę, że korzystasz z wersji 2, więc sugerowałbym użycie techniki, o której jakiś czas temu pisał na blogu Joel „Jaykul” Bennet .
Krótko mówiąc: po prostu owijasz swój ciąg znakiem @ '...' @:
(Pamiętaj, że założyłem, które cudzysłowy są potrzebne i przed którymi rzeczami próbujesz uciec). Jeśli chcesz pracować z wynikiem, możesz dodać
-NoNewWindow
przełącznik.BTW: to był tak ważny problem, że od wersji v3 możesz użyć,
--%
aby zatrzymać parser PowerShell przed robieniem czegokolwiek z twoimi parametrami:... powinno tam działać dobrze (przy tym samym założeniu).
źródło
@"
i"@
.Użycie znaku wstecznego (`) działa dobrze, jeśli umieszczę je w następujących miejscach:
$cmd
wraca jako:Czy tego szukałeś?
Błąd, który dał mi PowerShell, odnosił się do nieoczekiwanego tokena „sort1” i w ten sposób ustaliłem, gdzie umieścić znaki grawitacyjne.
Składnia @ '...' @ jest nazywana „ciągiem znaków” i zwróci dokładnie to, co zostało wprowadzone. Można ich również używać do wypełniania zmiennych w następujący sposób:
Symbole otwierania i zamykania muszą znajdować się w osobnych wierszach, jak pokazano powyżej.
źródło
Invoke-Expression
podwójnych cudzysłowów z$cmd
momentu wywołania? Albo jak używałeś$cmd
bez używaniaInvoke-Expression
?Znalazłem się dzisiaj w podobnej sytuacji, próbując uruchomić polecenie za pośrednictwem modułu Node.js:
Używałem PowerShell i próbowałem uruchomić:
Ale z dodatkowymi symbolami PowerShell manipulował argumentami. Aby to naprawić, zaznaczam wstecz znaki zmiany znaczenia w cudzysłowie:
źródło
"['`"][^'`"]['`"]"
działa… ale'[`'"][^`'"][`'"]'
nie działa! doprowadzało mnie do szału