92

在包含空格的路径中调用 exe 时,我遇到了 powershell 问题。

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

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

它似乎在“Windows”和“服务”之间的空间上分裂。知道如何解决这个问题吗?

4

15 回答 15

143

这会做你想要的吗?:

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

使用&调用运算符来调用名称或路径存储在带引号的字符串中和/或通过变量引用的命令,如已接受的答案中所示。Invoke-Expression不仅是在这种特殊情况下使用的错误工具,而且通常应该避免使用。

于 2013-08-30T16:08:01.863 回答
31

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

$path = 'C:\Windows Services\MyService.exe'
$path -replace ' ', '` '
invoke-expression $path
于 2013-08-30T16:13:16.800 回答
11
"&'C:\Windows Services\MyService.exe'" | Invoke-Expression

通过https://www.vistax64.com/powershell/52905-invoke-expression-exe-has-spaces-its-path.html

于 2017-03-28T07:38:09.670 回答
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
于 2017-08-09T09:38:42.513 回答
7

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

PS C:\> cd Program Files

这会导致错误,只需使用以下方法即可解决问题:

PS C:\> cd "Program Files"
于 2018-12-04T18:21:11.177 回答
6

这对我有用:

$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"
于 2019-05-16T20:14:38.863 回答
5

2018 年在 Windows10 上使用 Powershell,对我有用的只是用简单的引号替换双"'引号。正如答案中所建议的那样,在空格之前添加反引号会破坏路径。

于 2018-10-02T11:49:58.123 回答
3

自从 Invoke-Expression 对我来说很好用以来,我使用了一个 hack。

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

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

这只有在 exe 的名称中没有任何空格的情况下才有效。

希望这可以帮助

于 2014-11-17T21:04:47.550 回答
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
于 2019-06-18T20:34:52.977 回答
2

对我有用的(我需要创建 MySQL 转储的路径)是将目录放在 6 个双引号之间,如下所示:

$path = """C:\Path\To\File"""
于 2021-03-21T09:08:46.513 回答
2

请使用这个简单的一个衬里:

Invoke-Expression "C:\'Program Files (x86)\Microsoft Office\root\Office16'\EXCEL.EXE"
于 2019-02-08T19:51:41.213 回答
1

简单地把路径放在cd前面的双引号中,像这样:

cd "C:\Users\MyComputer\Documents\Visual Studio 2019\Projects"

于 2021-01-31T18:08:43.373 回答
0
  1. 通过输入命令进入根C盘

C:

  1. 键入cd然后按Tab 键,它将在所有可用位置之间切换,并在到达所需位置时按 Enter

cd {按标签}

于 2021-02-09T06:10:48.323 回答
0

试试这个,简单且没有太大变化:

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

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

于 2019-03-31T00:22:00.107 回答
-1

就放${yourpathtofile/folder}

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

于 2019-10-01T07:46:44.193 回答