Kiedy PowerShell widzi polecenie zaczynające się ciągiem po prostu ocenia ciąg, to znaczy, że zwykle Echos go do ekranu, na przykład:
PS> "Hello World"
Hello World
Jeśli chcesz PowerShell do interpretowania ciąg jako nazwa polecenia, a następnie użyć operatora połączeń (&) tak:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
Po że prawdopodobnie wystarczy zacytować pary parametr/argumentów, które conta w spacje i/lub znaki cudzysłowu. Gdy wywołasz taki plik EXE ze złożonymi argumentami wiersza poleceń, zazwyczaj bardzo pomocne jest narzędzie, które pokaże ci, jak PowerShell wysyła argumenty do pliku EXE. PowerShell Community Extensions ma takie narzędzie. Nazywa się to echoargs. Wystarczy zastąpić plik EXE z echoargs - pozostawiony wszystkie argumenty na miejscu, i pokaże ci, jak plik EXE otrzyma 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>
Korzystanie echoargs można eksperymentować, aż dojdziesz to dobrze , 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 starałem się zbyt mocno, aby utrzymać podwójne cudzysłowy wokół ciągu połączenia. Najwyraźniej nie jest to konieczne, ponieważ nawet cmd.exe usunie je.
BTW, czapki z głów dla zespołu PowerShell. Byli bardzo pomocni w pokazaniu mi konkretnej inkantacji pojedynczych & podwójnych cytatów, aby uzyskać pożądany wynik - jeśli zachodzi potrzeba utrzymania wewnętrznych podwójnych cytatów w miejscu. :-) Zdają sobie również sprawę z tego, że jest to obszar bólu, ale są one napędzane przez liczbę osób dotkniętych przez konkretny problem. Jeśli jest to dla ciebie obszar bólu, zagłosuj na to PowerShell bug submission.
Aby uzyskać więcej informacji na temat PowerShell analizuje, sprawdź mój Effective PowerShell blog series - konkretnie item 10 - "Understanding PowerShell Parsing Modes"
UPDATE 4/4/2012: Ta sytuacja staje się znacznie łatwiejsze w obsłudze w PowerShell V3. Zobacz ten blog post for details.
Zobacz również http://stackoverflow.com/questions/6224638/powershell-call-msbuild-with-nested-quotation-marks/8468690#8468690 –
Jeśli masz na myśli litteraly " w PowerShell "(co rozumiem jako" wewnątrz istniejącego monitu programu PowerShell), następnie następujący przykład może być łatwo dopasowany do twoich potrzeb. "Uwaga: nie ma potrzeby oddzielania polecenia od jego parametrów: ' # Pokaż wszystkie dostępne aktualizacje pakietów NPM zainstalowanych globalnie za pomocą narzędzia npm-check-updates [ciąg] $ cmd = 'ncu -g' Write-Verbose -Message $ cmd Invoke-Command -ScriptBlock ([ScriptBlock] :: Create ($ cmd)) ' – user3785010
Nie mam pojęcia, jak użyć" mini-markdown ", aby edytować powyższy komentarz, aby każdy wiersz kodu pojawia się w osobnym wierszu, a wygasł 5-minutowy limit edycji oryginalnego komentarza. Jeśli ktokolwiek wie, aby użyć "mini-Markdown", aby rozwiązać problem, odeślę go w bardziej czytelnej formie. Pierwsza linia powinna być tylko następujące: narzędzie # Wyświetl dostępne aktualizacje do zainstalowanych na całym świecie pakietów NPM za pomocą NPM-sprawdź aktualizacje – user3785010