Leerzeichen verursachen bei PowerShell eine Pfadaufteilung

74

Ich habe ein Problem mit Powershell, wenn ich eine Exe auf einem Pfad mit Leerzeichen aufrufe.

PS C:\Windows Services> invoke-expression "C:\Windows Services\MyService.exe"

Der Begriff "C: \ Windows" wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens. Wenn ein Pfad enthalten war, überprüfen Sie, ob der Pfad korrekt ist, und versuchen Sie es erneut.

Es scheint sich auf den Raum zwischen "Windows" und "Dienste" aufzuteilen. Irgendeine Idee, wie man dieses Problem umgehen kann?

Jaffa
quelle
Verwenden Sie &den Aufrufoperator , um Befehle aufzurufen, deren Namen oder Pfade in Zeichenfolgen in Anführungszeichen gespeichert sind und / oder wie in der akzeptierten Antwort über Variablen referenziert werden. Invoke-Expressionist in diesem speziellen Fall nicht nur das falsche Werkzeug, es sollte generell vermieden werden .
mklement0

Antworten:

111

Würde das tun, was Sie wollen?:

& "C:\Windows Services\MyService.exe"

Verwenden Sie &den Aufrufoperator , um Befehle aufzurufen, deren Namen oder Pfade in Zeichenfolgen in Anführungszeichen gespeichert sind und / oder wie in der akzeptierten Antwort über Variablen referenziert werden. Invoke-Expressionist in diesem speziellen Fall nicht nur das falsche Werkzeug, es sollte generell vermieden werden .

Adil Hindistan
quelle
26

Sie können dem Leerzeichen entkommen, indem Sie einfache Anführungszeichen und einen Backtick vor dem Leerzeichen verwenden:

$path = 'C:\Windows Services\MyService.exe'
$path -replace ' ', '` '
invoke-expression $path
Anthony Neace
quelle
Das Problem bei dieser Lösung ist, dass der Pfad als Argument übergeben wird und ich nicht steuern kann, wie er maskiert wird.
Jaffa
1
Sie können einfach -replacedie Variable ausführen , die den Pfad enthält, und '' durch '' 'ersetzen
Anthony Neace
1
Dies beantwortet zwar die gestellte Frage, es ist jedoch darauf hinzuweisen, dass dies Invoke-Expressionnicht nur das falsche Werkzeug für den Anwendungsfall des OP ist, sondern generell vermieden werden sollte .
mklement0
9

Ich bin mir nicht sicher, ob jemand es noch braucht ... Ich musste msbuild in Powershell aufrufen und Folgendes hat gut funktioniert:

$MSBuild = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe"

& $MSBuild $PathToSolution /p:OutDir=$OutDirVar /t:Rebuild /p:Configuration=Release
Jacek Plesnar
quelle
5

Mit Powershell unter Windows10 im Jahr 2018 funktionierte es für mich einfach , doppelte Anführungszeichen "durch einfache Anführungszeichen zu ersetzen' . Das Hinzufügen des Backticks vor dem Leerzeichen, wie in einer Antwort vorgeschlagen, brach den Pfad.

Seinecle
quelle
Funktioniert bei mir. Wenn ich ein doppeltes Anführungszeichen verwende, wird der Fehler angezeigt ParameterArgumentValidationError.
JDHAO
5

Das hat bei mir funktioniert:

$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"
J. Fischlein
quelle
Vielen Dank! Auf diese Weise wurde eine Powershell-Datei mit dem Namen wslLauncher.ps1Eclipse in Java gestartet , die sich in einem Pfad befand, der ein Leerzeichen enthielt. Die genaue Codezeile war:String command = "powershell.exe & '"+launcherPath+launcherName+"' ";
am
4

Wenn Sie einen Dateipfad mit Leerzeichen verwenden, können Sie ihn in Windows Powershell in doppelte Anführungszeichen setzen. Zum Beispiel, wenn Sie in das Verzeichnis "Programme" wechseln möchten, anstatt es zu verwenden

PS C:\> cd Program Files

Wenn Sie einen Fehler verursachen, verwenden Sie einfach Folgendes, um das Problem zu lösen:

PS C:\> cd "Program Files"
CathyQian
quelle
3

Es gibt einen Hack, den ich verwendet habe, seit der Invoke-Ausdruck für mich gut funktioniert.

Sie können den aktuellen Speicherort auf den Pfad mit Leerzeichen festlegen, den Ausdruck aufrufen, zum vorherigen Speicherort zurückkehren und fortfahren:

$currLocation = Get-Location
Set-Location = "C:\Windows Services\"
Invoke-Expression ".\MyService.exe"
Set-Location $currLocation

Dies funktioniert nur, wenn die Exe keine Leerzeichen in ihrem Namen hat.

Hoffe das hilft

c-chavez
quelle
3

Kann den .Punktoperator verwenden.

. "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"

oder der Start-ProcessBefehl

Start-Process -PSPath "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"

oder mit ProcessStartInfoundProcess

$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = 'C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe'
if($Admin){ $ProcessInfo.Verb = 'runas' }
$ProcessInfo.UseShellExecute = $false

$CommandParameters = '-noexit -noprofile -command Set-Location -LiteralPath c:\; $host.ui.RawUI.WindowTitle = ''[{0}] PS''; Set-PSReadlineOption -HistorySaveStyle SaveNothing;' -f $Cred.UserName
$ProcessInfo.Arguments = $CommandParameters
$ProcessInfo.Domain = ($Cred.UserName -split '\\')[0]
$ProcessInfo.UserName = ($Cred.UserName -split '\\')[1]
$ProcessInfo.Password = $Cred.Password

$ProcessObject = New-Object -TypeName System.Diagnostics.Process
$ProcessObject.StartInfo = $ProcessInfo
$ProcessObject.Start() | Out-Null
jkdba
quelle
1

Bitte benutzen Sie diesen einfachen Einzeiler:

Invoke-Expression "C:\'Program Files (x86)\Microsoft Office\root\Office16'\EXCEL.EXE"
Pramod
quelle
0

Versuchen Sie dies einfach und ohne große Veränderung:

invoke-expression "'C:\Windows Services\MyService.exe'"

Verwenden Sie einfache Anführungszeichen am Anfang und Ende des Pfads.

djsp
quelle
-1

Einfach gesagt ${yourpathtofile/folder}

PowerShell zählt keine Leerzeichen. Fügen Sie Ihren Pfad zwischen ${& hinzu, um PowerShell anzuweisen, den gesamten Pfad einschließlich Leerzeichen zu berücksichtigen }.

Krishna Gupta
quelle