空格导致使用PowerShell分割路径


74

在包含空格的路径上调用exe时,powershell出现问题。

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

术语“ C:\ Windows”不被视为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。

它似乎在“ Windows”和“服务”之间的空间上分裂了。任何想法如何解决这个问题?


使用&调用运算符,可以调用其名称或路径存储在带引号的字符串中和/或通过变量引用的命令,如在接受的答案中一样。Invoke-Expression不仅是错误的工具,以在这种特殊情况下使用,它应该一般被避免
mklement0

Answers:


111

这会做你想要的吗?:

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

使用&调用运算符,可以调用其名称或路径存储在带引号的字符串中和/或通过变量引用的命令,如在接受的答案中一样。Invoke-Expression不仅是错误的工具,以在这种特殊情况下使用,它应该一般被避免


26

您可以通过在空格前使用单引号和反引号来转义该空格:

$path = 'C:\Windows Services\MyService.exe'
$path -replace ' ', '` '
invoke-expression $path

这种解决方案的问题在于,该路径作为参数传递,而我无法控制如何对其进行转义。
jaffa

1
您可以只-replace对包含路径的变量执行操作,并将''替换为'`'
Anthony Neace 2013年

1
尽管这可以回答所提出的问题,但值得指出的Invoke-Expression是,这不仅是用于OP用例的错误工具,而且通常应避免使用
mklement0


9

不知道是否有人仍然需要它...我需要在powershell中调用msbuild,以下方法运行良好:

$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

5

在2018年在Windows10上使用Powershell,对我有用的只是将双引号替换"为简单引号'。正如答案中所建议的,在空格之前添加反引号可以解决问题。


为我工作。如果我使用双引号,则会出现错误ParameterArgumentValidationError
jdhao

5

这对我有用:

$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"

非常感谢你!这可以wslLauncher.ps1从Java Eclipse中启动一个名为Powershell文件,该文件位于包含空格的路径中。的准确代码行是:String command = "powershell.exe & '"+launcherPath+launcherName+"' ";

4

对于任何带有空格的文件路径,只需将它们放在双引号中即可在Windows Powershell中使用。例如,如果要转到Program Files目录,而不是使用

PS C:\> cd Program Files

这将导致错误,只需使用以下命令即可解决问题:

PS C:\> cd "Program Files"

3

自从Invoke-Expression对我有效以来,我一直在使用一种技巧。

您可以将当前位置设置为带空格的路径,调用表达式,返回到先前的位置并继续:

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

仅当exe名称中没有空格时,这才有效。

希望这可以帮助


3

可以使用.点运算符。

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

Start-Process命令

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

或使用ProcessStartInfoProcess

$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

1

请使用此简单的一个班轮:

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

0

尝试一下,简单且无需太多更改:

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

在路径的开头和结尾使用单引号。


-1

刚放 ${yourpathtofile/folder}

PowerShell不计算空格;要告诉PowerShell考虑整个路径(包括空格),请在${&之间添加路径}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.