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?
powershell
Jaffa
quelle
quelle
&
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-Expression
ist in diesem speziellen Fall nicht nur das falsche Werkzeug, es sollte generell vermieden werden .Antworten:
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-Expression
ist in diesem speziellen Fall nicht nur das falsche Werkzeug, es sollte generell vermieden werden .quelle
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
quelle
-replace
die Variable ausführen , die den Pfad enthält, und '' durch '' 'ersetzenInvoke-Expression
nicht nur das falsche Werkzeug für den Anwendungsfall des OP ist, sondern generell vermieden werden sollte ."&'C:\Windows Services\MyService.exe'" | Invoke-Expression
über https://www.vistax64.com/powershell/52905-invoke-expression-exe-has-spaces-its-path.html
quelle
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
quelle
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.quelle
ParameterArgumentValidationError
.Das hat bei mir funktioniert:
$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"
quelle
wslLauncher.ps1
Eclipse in Java gestartet , die sich in einem Pfad befand, der ein Leerzeichen enthielt. Die genaue Codezeile war:String command = "powershell.exe & '"+launcherPath+launcherName+"' ";
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"
quelle
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
quelle
Kann den
.
Punktoperator verwenden.. "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"
oder der
Start-Process
BefehlStart-Process -PSPath "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"
oder mit
ProcessStartInfo
undProcess
$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
quelle
Bitte benutzen Sie diesen einfachen Einzeiler:
Invoke-Expression "C:\'Program Files (x86)\Microsoft Office\root\Office16'\EXCEL.EXE"
quelle
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.
quelle
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}
.quelle