Jak uruchomić następujące polecenie w PowerShell?
C: \ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Źródło danych = mysource; Zintegrowane zabezpieczenia = fałsz; Identyfikator użytkownika = sa; Pwd = sapass!; Baza danych = mydb;" -dest: dbfullsql = "Źródło danych =. \ mydestsource; Zintegrowane zabezpieczenia = fałsz; ID użytkownika = sa; Pwd = sapass!; Baza danych = mydb;", nazwa_komputera = 10.10.10.10, nazwa użytkownika = administrator, hasło = hasło administratora
powershell
parameters
quotes
exe
spaces
Samochody dostawcze
źródło
źródło
# Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
Odpowiedzi:
Gdy PowerShell widzi polecenie zaczynające się od łańcucha, po prostu ocenia ten ciąg, tzn. Zwykle wyświetla go na ekranie, na przykład:
Jeśli chcesz, aby PowerShell interpretował ciąg jako nazwę polecenia, użyj operatora wywołania (&) w następujący sposób:
Następnie prawdopodobnie będziesz musiał jedynie cytować pary parametrów / argumentów zawierające spacje i / lub znaki cudzysłowu. Gdy wywołujesz plik EXE taki jak ten ze złożonymi argumentami wiersza poleceń, zwykle bardzo pomocne jest posiadanie narzędzia, które pokaże, w jaki sposób PowerShell wysyła argumenty do pliku EXE. PowerShell Community Extensions ma takiego narzędzia. Nazywa się to echoargs. Po prostu zamienisz plik EXE na echoargs - pozostawiając wszystkie argumenty na miejscu, a pokaże Ci, jak plik EXE odbierze argumenty, na przykład:
Korzystając z echa, możesz eksperymentować, dopóki nie zrobisz tego poprawnie, na przykład:
Okazuje się, że zbyt mocno starałem się zachować podwójne cudzysłowy wokół ciągu połączenia. Najwyraźniej nie jest to konieczne, ponieważ nawet cmd.exe je usunie.
BTW, czapki z głów przed zespołem PowerShell. Były bardzo pomocne w pokazaniu mi specyficznej inkantacji pojedynczych i podwójnych cudzysłowów, aby uzyskać pożądany rezultat - jeśli trzeba było utrzymać wewnętrzne podwójne cudzysłowy na miejscu. :-) Zdają sobie również sprawę z tego, że jest to obszar bólu, ale kieruje nimi liczba osób dotkniętych konkretnym problemem. Jeśli jest to dla Ciebie problem, zagłosuj za zgłoszeniem błędu programu PowerShell .
Aby uzyskać więcej informacji na temat sposobu analizowania programu PowerShell, zobacz moją serię blogów dotyczących efektywnego programu PowerShell - w szczególności punkt 10 - „Omówienie trybów analizy programu PowerShell”
AKTUALIZACJA 4/4/2012: Ta sytuacja staje się znacznie łatwiejsza w PowerShell V3. Zobacz ten post na blogu, aby uzyskać szczegółowe informacje .
źródło
echoargs
daje wskazanie, w jaki sposób PowerShell interpretuje argumenty, zanim przekaże je do EXE.& 'C:\Program Files\Sublime Text 3\sublime_text.exe'
bezpośrednio w konsoli i działa, ale w pliku wsadowym pojawia się komunikat o błędzie „i było nieoczekiwane w tym momencie”.START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Po prostu dodaj operator & przed nazwą .exe. Oto polecenie instalacji programu SQL Server Express w trybie ciszy:
źródło
Miałem spacje zarówno w poleceniu, jak i parametrach, i to działało dla mnie:
Jest to w zasadzie to samo co odpowiedź Akiry, ale działa to, jeśli dynamicznie budujesz parametry polecenia i umieszczasz je w zmiennej.
źródło
EchoArgs
To działało dla mnie:
Po prostu umieść ścieżki lub parametry połączenia w jednym elemencie tablicy i podziel pozostałe elementy na jeden element tablicy.
Istnieje wiele innych opcji tutaj: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
Microsoft powinien uprościć ten sposób i zapewnić zgodność ze składnią wiersza poleceń.
źródło
Istnieje wiele metod, których możesz użyć, aby to zrobić.
Metoda 1
Prosty przykład
W Twoim przypadku
W tej metodzie oddzielasz każdy parametr w ArgumentList za pomocą przecinków.
Metoda 2
Prosty przykład
W Twoim przypadku
Ta metoda jest łatwiejsza, ponieważ pozwala na wpisanie parametrów za jednym razem.
Odnośniki: Powershell / Scripting / Start-Process
źródło
Zobacz tę stronę: https://slai.github.io/posts/powershell-and-external-commands-done-right/
Podsumowanie przy użyciu vshadow jako zewnętrznego pliku wykonywalnego:
źródło
W przypadku, gdy ktoś zastanawia się, jak po prostu uruchomić plik wykonywalny:
.....>. \ file.exe
lub
......> full \ path \ to \ file.exe
źródło
Udało mi się uruchomić podobne polecenie przy użyciu następującego podejścia:
Dla twojego polecenia (nie to, że teraz dużo to pomaga), rzeczy wyglądałyby mniej więcej tak:
Kluczowe punkty to:
Nie próbowałem dodawać części „nazwa_komputera” na końcu wiersza poleceń, ale mam nadzieję, że te informacje pomogą innym czytającym to teraz zbliżyć się do pożądanego rezultatu.
źródło
Nowy ciąg znaków ucieczki w PowerShell V3 cytowany z Nowe funkcje języka V3 :
Sieć jest pełna wierszy poleceń napisanych dla Cmd.exe. Te wiersze poleceń działają wystarczająco często w programie PowerShell, ale jeśli zawierają określone znaki, na przykład średnik (;), znak dolara ($) lub nawiasy klamrowe, należy wprowadzić pewne zmiany, prawdopodobnie dodając kilka cudzysłowów. To wydawało się być źródłem wielu drobnych bólów głowy.
Aby rozwiązać ten scenariusz, dodaliśmy nowy sposób na „ucieczkę” podczas analizowania wierszy poleceń. Jeśli użyjesz magicznego parametru -%, zatrzymamy nasze normalne przetwarzanie linii poleceń i przełączymy na coś znacznie prostszego. Nie pasujemy do cytatów. Nie zatrzymujemy się na średniku. Nie rozwijamy zmiennych PowerShell. Rozwijamy zmienne środowiskowe, jeśli używasz składni Cmd.exe (np.% TEMP%). Poza tym argumenty aż do końca linii (lub potoku, jeśli używasz potoku) są przekazywane bez zmian. Oto przykład:
źródło
Możesz użyć:
Kluczową rzeczą, na którą należy tutaj zwrócić uwagę, jest to, że FilePath musi znajdować się w pozycji 0, zgodnie z Przewodnikiem pomocniczym. Aby wywołać przewodnik pomocy dla komendy, po prostu wpisz
Get-Help <Commandlet-name> -Detailed
. W tym przypadku tak jestGet-Help Start-Process -Detailed
.źródło
Próbowałem wszystkich sugestii, ale nadal nie mogłem uruchomić
msiexec.exe
z parametrami zawierającymi spacje. Więc moje rozwiązanie zakończyło się naSystem.Diagnostics.ProcessStartInfo
:źródło
To działało dla mnie:
Wydaje się, że kluczem jest to, że całe polecenie jest ujęte w cudzysłowy, znak „&” służy do określenia, że wykonywany jest inny plik polecenia potomnego, a następnie cudzysłowy (podwójne-podwójne-) cudzysłowy wokół nazwy ścieżki / pliku ze spacjami w którym chciałeś wykonać przede wszystkim.
Jest to także zakończenie jedynego obejścia problemu z MS connect, że -File nie przekazuje niezerowych kodów powrotu, a -Command jest jedyną alternatywą. Ale do tej pory uważano, że ograniczeniem polecenia jest to, że nie obsługuje on spacji. Zaktualizowałem również ten element opinii.
http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option
źródło
Alternatywną odpowiedzią jest użycie przełącznika poleceń zakodowanego w Base64 :
Po odkodowaniu zobaczysz, że jest to oryginalny fragment OP z zachowanymi wszystkimi argumentami i podwójnymi cudzysłowami.
Oryginalne polecenie:
Zmienia się w to, gdy jest zakodowany jako Base64:
a oto jak replikować w domu:
źródło
Możesz uruchamiać pliki exe w PowerShell na różne sposoby. Na przykład, jeśli chcesz uruchomić unrar.exe i wyodrębnić plik .rar, możesz po prostu napisać w PowerShell:
Ale czasami to nie działa, więc musisz użyć parametru & jak pokazano powyżej: Na przykład w przypadku vboxmanage.exe (narzędzie do zarządzania maszynami wirtualnymi virtualbox) musisz wywoływać parametry poza ciągiem w ten sposób, bez cudzysłowów:
Jeśli chcesz wywołać po prostu zarchiwizowany plik winrar jako pliki .exe, możesz również rozpakować go za pomocą polecenia cmdlet invoke-command i parametru Silent / S (Wyodrębni się on w tym samym folderze, w którym został skompresowany).
Istnieje więc kilka sposobów uruchamiania plików .exe z argumentami w programie PowerShell.
Czasami trzeba znaleźć obejście, aby działało poprawnie, co może wymagać dodatkowego wysiłku i bólu :) w zależności od sposobu skompilowania .exe lub uczynienia go swoim twórcą.
źródło
Używam tej prostej, czystej i skutecznej metody.
Umieszczam argumenty w tablicy, 1 na linię. W ten sposób bardzo łatwo jest czytać i edytować. Następnie używam prostej sztuczki polegającej na przekazaniu wszystkich argumentów wewnątrz podwójnych cudzysłowów do funkcji z 1 pojedynczym parametrem. To spłaszcza je, łącznie z tablicami, do pojedynczego ciągu, który następnie wykonuję za pomocą „Invoke-Expression” PS. Ta dyrektywa została zaprojektowana specjalnie do konwertowania ciągu znaków na polecenie uruchamialne. Działa dobrze:
źródło
Następujący kod działał idealnie na moim laptopie:
Potem, gdy próbowałem uruchomić to bezpośrednio na jednym serwerze, zacząłem otrzymywać te błędy
"Unrecognized argument ...etc.... All arguments must begin with "-". "
Po wypróbowaniu wszystkich możliwych obejść (bez powodzenia) dowiedziałem się, że Powershell na serwerze (Windows 2008 R2) był w wersji 3.0, podczas gdy mój laptop ma 5.0. (możesz użyć „$ PSVersionTable”, aby zobaczyć wersję).
Po aktualizacji Powershell do najnowszej wersji zaczął działać ponownie.
źródło
Cmd może obsłużyć uruchamianie cytowanego exe, ale Powershell nie. Po prostu zajmę się samym uruchomieniem exe, ponieważ go nie mam. Jeśli dosłownie potrzebujesz wysłać podwójny cudzysłów do argumentu polecenia zewnętrznego, to kolejny problem, który został omówiony gdzie indziej.
1) dodaj folder exe do swojej ścieżki, być może w swoim profilu $
2) cofnij spację:
źródło
Natknąłem się na podobny problem i postanowiłem go rozwiązać w ten sposób:
invoke-expression
nowego łańcuchaPrzykładowe rozwiązanie:
źródło
W przypadku nazwy pliku wykonywalnego można użyć polecenia cmdlet z nowym aliasem, aby uniknąć zajmowania się spacjami lub konieczności dodania pliku wykonywalnego do środowiska $ PATH.
Aby wyświetlić lub zmodyfikować aliasy PS, zobacz także
Od Jeffery Hicks Aarticle
Inne odpowiedzi dotyczą argumentów.
źródło