Jak uruchomić plik EXE w PowerShell z parametrami ze spacjami i cudzysłowami


332

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



Jeśli masz na myśli dosłownie „w programie PowerShell” (co interpretuję jako „wewnątrz istniejącego monitu programu PowerShell), to poniższy przykład można łatwo dostosować do własnych potrzeb. Zauważ, że nie ma potrzeby oddzielania polecenia od jego parametrów: # 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))
użytkownik3785010

Nie mam pojęcia, jak użyć „mini-markdown” do edycji powyższego komentarza, aby każdy wiersz kodu pojawiał się w osobnym wierszu i upłynął limit 5 minut na edytowanie oryginalnego komentarza. Jeśli ktokolwiek wie teraz, aby użyć „mini-Markdown” do rozwiązania problemu, opublikuję ponownie w bardziej czytelnej formie. Pierwszy wiersz powinien wyglądać następująco: # Pokaż wszelkie dostępne aktualizacje globalnie zainstalowanych pakietów npm za pomocą narzędzia npm-check-updates
użytkownik3785010

Odpowiedzi:


346

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:

PS> "Hello World"
Hello World

Jeśli chcesz, aby PowerShell interpretował ciąg jako nazwę polecenia, użyj operatora wywołania (&) w następujący sposób:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

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:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

Korzystając z echa, możesz eksperymentować, dopóki nie zrobisz tego poprawnie, na przykład:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

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 .


1
jeśli używam jako drugiego przykładu, otrzymuję ten błąd: Błąd: Nierozpoznany argument „” -source: dbfullsql = "„ „Data”. Wszystkie argumenty muszą zaczynać się od „-”.
Vans

2
Przepraszam nie rozumiem Widzę, że obecnie 6 osób głosowało za odpowiedzią, więc brakuje mi czegoś oczywistego, ale jaka jest prawdziwa odpowiedź? Czy istnieje specjalna zasada, którą należy wiedzieć o parametrach ze spacjami za pomocą programu PowerShell, czy tylko sugerujesz, aby brać ją indywidualnie, używając EchoArgs, aby pomóc?
Tyler Collier,

Cytowanie argumentów jest zwykle wystarczające, ale nie zawsze. W tych przypadkach, w których to nie działa, użycie echoargsdaje wskazanie, w jaki sposób PowerShell interpretuje argumenty, zanim przekaże je do EXE.
Keith Hill

1
Czy wiesz, jak bym to zrobił w pliku .bat? Próbuję & '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”.
Joe Zim

Nieważne. Znaleziono:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Joe Zim

61

Po prostu dodaj operator & przed nazwą .exe. Oto polecenie instalacji programu SQL Server Express w trybie ciszy:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

53

Miałem spacje zarówno w poleceniu, jak i parametrach, i to działało dla mnie:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

Jest to w zasadzie to samo co odpowiedź Akiry, ale działa to, jeśli dynamicznie budujesz parametry polecenia i umieszczasz je w zmiennej.


2
imho to jest najlepsze! brak base64, brak dziwnych -% składni, które przełączają podstawianie, normalne reguły podstawiania w PowerShell, bez zamieszania, bardzo czytelne.
AnneTheAgile,

1
To nie działa Jeśli parametr zawiera nazwę ścieżki, nazwa ścieżki zostanie podzielona na wiele parametrów.
BrainSlugs83

1
Niezła odpowiedź. Czy będzie jednak działać z cudzysłowami w parametrach?
Akira Yamamoto,

Spróbuj tego, po wszystkim innym to faktycznie działało. A także skorzystaj z rozszerzenia PowershellEchoArgs
Jeremy Thompson

34

To działało dla mnie:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

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ń.


2
Tablica jest zdecydowanie najlepszą opcją - działało to dla mnie świetnie. Tyle że przekazałem zmienną tablicową, ponieważ moje argumenty były dynamiczne. Dzięki.
Jon Barker,

Najlepsze rozwiązanie IMHO
Vasin Yuriy

25

Istnieje wiele metod, których możesz użyć, aby to zrobić.

Istnieją inne metody, takie jak użycie operatora wywołania ( & ), polecenia cmdlet Wywołanie-Wyrażenie itp. Są one jednak uważane za niebezpieczne. Microsoft zaleca stosowanie Start-Process .

Metoda 1

Prosty przykład

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

W Twoim przypadku

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync","-source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","-dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","computername=10.10.10.10","username=administrator","password=adminpass"

W tej metodzie oddzielasz każdy parametr w ArgumentList za pomocą przecinków.

Metoda 2

Prosty przykład

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

W Twoim przypadku

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`" -dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`",computername=10.10.10.10,username=administrator,password=adminpass"

Ta metoda jest łatwiejsza, ponieważ pozwala na wpisanie parametrów za jednym razem.

Zauważ, że w PowerShell do reprezentowania cudzysłowu („) w ciągu należy wstawić poważny akcent (`) (Jest to klawisz nad klawiszem Tab na klawiaturze amerykańskiej).

Parametr -NoNewWindow służy do wyświetlenia nowego procesu w bieżącym oknie konsoli. Domyślnie Windows PowerShell otwiera nowe okno.

Odnośniki: Powershell / Scripting / Start-Process


Proste zawsze wygrywa! Dzięki.
Mike Casas

Dzięki za ostatnią notatkę na temat ucieczki z cudzysłowu!
Paolo


13

W przypadku, gdy ktoś zastanawia się, jak po prostu uruchomić plik wykonywalny:

.....>. \ file.exe

lub

......> full \ path \ to \ file.exe


2
To powinna być odpowiedź na to pytanie, to jest to, czego szukamy, gdy wyszukujemy za pomocą słów kluczowych „Start EXE z PowerShell”. Dziękuję Ci !
Jean-Daniel Gasser

2
Co powiesz na bieganie z argumentami?
SereneWizard

1
@SereneWizard Cóż, dodaj je po .exe ze spacją między nimi. Przykład:. \ File.exe param1 param2 param3
darkgaze

9

Udało mi się uruchomić podobne polecenie przy użyciu następującego podejścia:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

Dla twojego polecenia (nie to, że teraz dużo to pomaga), rzeczy wyglądałyby mniej więcej tak:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Kluczowe punkty to:

  • Użyj cudzysłowów wokół argumentu źródłowego i usuń osadzone cudzysłowy wokół ciągu połączenia
  • Użyj alternatywnych nazw kluczy do budowania ciągu połączenia SQL, w którym nie ma spacji. Na przykład użyj „UID” zamiast „Identyfikatora użytkownika”, „Serwer” zamiast „Źródło danych”, „Trusted_Connection” zamiast „Integrated Security” i tak dalej. Byłem w stanie uruchomić go dopiero po usunięciu wszystkich spacji z ciągu połączenia.

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.


2
Próbowałem wszystkich innych odpowiedzi, ale to była jedyna odpowiedź, która zadziałała dla mnie! Dziękujemy za udostępnienie tej alternatywnej ścieżki.
Wysłano

6

Nowy ciąg znaków ucieczki w PowerShell V3 cytowany z Nowe funkcje języka V3 :

Łatwiejsze ponowne użycie linii poleceń z Cmd.exe

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:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>

6

Możesz użyć:

Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

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 jest Get-Help Start-Process -Detailed.


5

Próbowałem wszystkich sugestii, ale nadal nie mogłem uruchomić msiexec.exez parametrami zawierającymi spacje. Więc moje rozwiązanie zakończyło się na System.Diagnostics.ProcessStartInfo:

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()

3

To działało dla mnie:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

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


1
Nie ma to związku z pytaniem operacyjnym, konkretnie zapytał, jak uruchomić długie polecenie w swoim poście w PowerShell. Nie jak uruchomić skrypt PowerShell ze spacjami w ścieżce pliku.
leinad13

Przeczytaj tytuł pytania, spacje są problemem, a nie długością. To jedna ważna odpowiedź na takie problemy, dlatego warto się nią podzielić. Czy miałeś ten sam problem i rzeczywiście go wypróbowałeś? Jeśli chcesz to poprawić, prześlij edycję zawierającą rzeczywiste polecenie w pytaniu, a ja je zaakceptuję.
Tony Wall

3

Alternatywną odpowiedzią jest użycie przełącznika poleceń zakodowanego w Base64 :

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

Po odkodowaniu zobaczysz, że jest to oryginalny fragment OP z zachowanymi wszystkimi argumentami i podwójnymi cudzysłowami.

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

Oryginalne polecenie:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

Zmienia się w to, gdy jest zakodowany jako Base64:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

a oto jak replikować w domu:

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip

3

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:

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

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:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

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).

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

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ą.


1

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:

                    # function with one argument will flatten 
                    # all passed-in entries into 1 single string line
Function Execute($command) {
                    # execute:
    Invoke-Expression $command;
                    # if you have trouble try:
  # Invoke-Expression "& $command";
                    # or if you need also output to a variable
  # Invoke-Expression $command | Tee-Object -Variable cmdOutput;

}

#  ... your main code here ...

               # The name of your executable app
$app = 'my_app.exe';
               # List of arguments:
               #    Notice the type of quotes - important !
               #    Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';

               # pass all arguments inside double quotes
Execute "$app $args";

1

Następujący kod działał idealnie na moim laptopie:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

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.


1

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 $

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy

2) cofnij spację:

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe

0

Natknąłem się na podobny problem i postanowiłem go rozwiązać w ten sposób:

  1. Uciekaj od znaków cudzysłowu („) za pomocą strzałki wstecz („)
  2. Otocz swoje nowe wyrażenie cudzysłowami („)
  3. Za pomocą operatora wywołania (&) wydaj polecenie invoke-expressionnowego łańcucha

Przykładowe rozwiązanie:

& {invoke-expression "C: \ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql =` "Źródło danych = mysource; Integrated Security = false; ID 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 = adminpass '"}


0

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.

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

Aby wyświetlić lub zmodyfikować aliasy PS, zobacz także

PS> get-alias
PS> set-alias

Od Jeffery Hicks Aarticle

Inne odpowiedzi dotyczą argumentów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.