【问题标题】:Spaces cause split in path with PowerShell空格导致 PowerShell 的路径拆分
【发布时间】:2022-05-18 21:57:41
【问题描述】:

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

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

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

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

【问题讨论】:

标签: powershell


【解决方案1】:

这会做你想要的吗?:

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

使用&, the call operator,调用名称或路径存储在带引号的字符串中和/或通过变量引用的命令,如已接受的答案中所示。 Invoke-Expression 不仅是在这种特殊情况下使用的错误工具,it should generally be avoided

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这个解决方案的问题是路径是作为参数传入的,我无法控制它是如何转义的。
    • 你可以只对包含路径的变量执行-replace,并将''替换为'`'
    • 虽然这回答了问题,但值得指出的是,Invoke-Expression 不仅是用于 OP 用例的错误工具,it should generally be avoided
    【解决方案3】:
    "&'C:\Windows Services\MyService.exe'" | Invoke-Expression
    

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

    【讨论】:

      【解决方案4】:

      不确定是否有人仍然需要它...我需要在 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】:

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

        PS C:\> cd Program Files
        

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

        PS C:\> cd "Program Files"
        

        【讨论】:

          【解决方案6】:

          这对我有用:

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

          【讨论】:

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

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

          【讨论】:

          • 为我工作。如果我使用双引号,我会收到错误 ParameterArgumentValidationError
          【解决方案8】:

          我使用了一个 hack,因为 Invoke-Expression 对我来说很好用。

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

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

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

          希望对你有帮助

          【讨论】:

            【解决方案9】:

            可以使用.点运算符。

            . "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
            

            【讨论】:

              【解决方案10】:

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

              $path = """C:\Path\To\File"""
              

              【讨论】:

                【解决方案11】:

                请使用这个简单的单行:

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

                【讨论】:

                  【解决方案12】:

                  试试这个,简单且无需太多改动:

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

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

                  【讨论】:

                  • 当我需要从 bash 调用 powershell 脚本并且双引号或三重双引号没有削减它时,这对我有用。
                  【解决方案13】:

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

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

                  【讨论】:

                    【解决方案14】:

                    由于用于passing arguments to native commands 的多个PowerShell quoting rules 也有特定的experimental Features in PowerShell,因此引用可能会变得非常混乱。因此,在某些情况下,解决方案可能只是不要陷入兔子洞

                    避免使用8.3 filenames 用空格引用文件路径

                    $FSO = New-Object -ComObject Scripting.FileSystemObject
                    $FSO.getfile('C:\Windows Services\MyService.exe').ShortPath
                    C:\WINDOW~1\MYSERV~1.EXE
                    

                    【讨论】:

                      【解决方案15】:

                      只需输入${yourpathtofile/folder}

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

                      【讨论】:

                        【解决方案16】:
                        1. 通过输入命令进入根C盘

                        C:

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

                        cd {按标签}

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-08-07
                          • 1970-01-01
                          • 2018-06-18
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多