Mogę wyrazić moją potrzebę w następującym scenariuszu: Napisz funkcję, która akceptuje ciąg znaków jako polecenie rodzime.
Pomysł nie jest zbyt daleko idący: jeśli łączysz się z innymi narzędziami wiersza poleceń z innych miejsc w firmie, które dostarczają ci polecenia do uruchamiania dosłownie. Ponieważ nie kontrolujesz polecenia, musisz zaakceptować każde prawidłowe polecenie jako dane wejściowe . Oto główne czkawki, których nie byłem w stanie łatwo pokonać:
Polecenie może uruchomić program żyjący na ścieżce ze spacją:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
Polecenie może zawierać parametry ze spacjami:
$command = 'echo "hello world!"';
Polecenie może mieć zarówno pojedyncze, jak i podwójne tiki:
$command = "echo `"it`'s`"";
Czy jest jakiś czysty sposób na osiągnięcie tego? Byłem w stanie wymyślić obfite i brzydkie obejścia, ale dla języka skryptowego uważam, że to powinno być bardzo proste.
źródło
eval
to, że na wpół żartuje, ponieważ tak to się nazywa w wielu innych językach skryptowych i nie jest to pierwsze pytanie, jakie widziałem, gdy ktoś nie miał pojęciainvoke-expression
. A sprawa OP brzmi jak wewnętrzny skrypt.Invoke-Expression "& $command"
Zapoznaj się także z tym raportem Microsoft Connect, na temat tego, jak bardzo trudno jest używać programu PowerShell do uruchamiania poleceń powłoki (o ironio).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
Sugerują użycie
--%
jako sposobu zmuszenia PowerShell do zaprzestania próby interpretacji tekstu po prawej stronie.Na przykład:
źródło
Przyjęta odpowiedź nie działała dla mnie podczas próby przeanalizowania rejestru pod kątem ciągów deinstalacji i wykonania ich. Okazuje się, że mimo wszystko nie potrzebowałem telefonu
Invoke-Expression
.W końcu natknąłem się na ten fajny szablon do sprawdzania, jak wykonać ciąg deinstalacyjny:
Działa to dla mnie, ponieważ
$app
jest aplikacją wewnętrzną, o której wiem, że ma tylko dwa argumenty. W przypadku bardziej złożonych ciągów deinstalacji możesz użyć operatora łączyć . Użyłem też mapy skrótów, ale tak naprawdę prawdopodobnie będziesz chciał użyć tablicy.Ponadto, jeśli masz zainstalowanych wiele wersji tej samej aplikacji, ten deinstalator będzie je przeglądał wszystkie naraz, co myli
MsiExec.exe
, więc i to.źródło
Jeśli chcesz użyć operatora wywołania, argumentami może być tablica przechowywana w zmiennej:
Operator połączenia działa również z obiektami ApplicationInfo.
źródło