【问题标题】:Can i run a exe with cmd or powershell if i have spaces in username?如果我的用户名中有空格,我可以使用 cmd 或 powershell 运行 exe 吗?
【发布时间】:2021-12-04 14:49:25
【问题描述】:

例如:

cmd /C start C:\Users\Bob Builder\Desktop\New Folder\test.exe

我正在尝试使用 cmd 启动文件,但由于路径中有空格,因此 cmd 在 Bob 之后抛出错误。

错误:

"Windows 找不到 C:\Users\Bob。请确保您输入了名称 正确,然后再试一次。”

系统找不到文件 C:\Users\Bob。

它只是无法接受空格。这让我发疯,因为我被 C# 开箱即用的工作宠坏了。我对此知之甚少,我花了太多时间试图弄清楚这一点。一些帮助将不胜感激。

【问题讨论】:

  • python、C#和C++在这里有什么关系?不要标记垃圾邮件
  • 它被视为单独的标记。使用引号。您也不必调用 cmd.exe。只需从 PowerShell 运行它。
  • 你在哪里执行命令?来自cmd 提示?来自powershell 提示?别的地方?您刚刚在powershell 标记中进行了编辑,即使问题中没有任何指示。
  • 您对“开箱即用”的定义是什么? c# 需要在字符串/路径周围加上引号。当涉及到您使用哪种类型的引号时,PowerShell 更加宽容。
  • 我的定义是字符串 apppath = @"mydamnnormalpathherewithnobullshit"

标签: powershell cmd syntax arguments


【解决方案1】:
  • 为了使包含空格路径被识别为单个路径(参数),它必须是引用

  • 为了使可执行文件当前控制台窗口中同步执行,其流连接到调用外壳,必须调用它直接,而不是通过start

cmd.exe 直接调用(仅支持"..." 引用):

"C:\Users\Bob Builder\Desktop\New Folder\test.exe"

来自 PowerShell:

& 'C:\Users\Bob Builder\Desktop\New Folder\test.exe'

注意:

  • PowerShell 还支持 '...' 字符串(单引号),如果您不需要扩展变量(字符串插值) - 请参阅概念性 about_Quoting_Rules 帮助主题。

  • 出于语法原因,PowerShell 需要使用&call operator 来调用被引用和/或包含变量引用的命令 - 请参阅@987654323 @了解详情。


相比之下,使用start in cmd.exe / Start-Process in PowerShell(其内置别名也是start新窗口(在 Windows 上),异步,无法(直接)捕获已启动的可执行文件的输出:

来自cmd.exe

start "title" "C:\Users\Bob Builder\Desktop\New Folder\test.exe"

注意:

  • 指定"title" - 即自选(控制台)窗口标题 - 在这种情况下出于语法原因需要:没有它,双引号路径本身将被解释为窗口标题,而要启动的 - 隐含 - 可执行文件将是另一个 cmd.exe 实例。

  • 请注意,如果您以这种方式启动 GUI 应用程序,则 title 参数无关紧要,因为不会创建新的 console 窗口。
    相反,如果您启动由双引号路径指定的 console 应用程序,因此 必须 使用标题参数,请注意 "" 将导致新窗口具有 没有标题。

来自 PowerShell(位置隐含参数 -FilePath):

Start-Process 'C:\Users\Bob Builder\Desktop\New Folder\test.exe'

注意:

  • Start-Process支持指定窗口标题,因此您可能需要为此调用cmd.exe 的内部start 命令(或Start-Process 不支持的其他功能,比如指定进程优先级)。

  • 要解决引用问题,请从 PowerShell 调用 cmd.exestart,方法是将整个 start 命令作为单个字符串传递给 cmd /c

    cmd /c 'start "title" "C:\Users\Bob Builder\Desktop\New Folder\test.exe"'
    

【讨论】:

    【解决方案2】:

    cmd /C start "C:\Users\Bob Builder\Desktop\New Folder\test.exe"

    行情是你的朋友。有时甚至双引号也是如此!

    【讨论】:

    • 这是在一个 cmd 窗口中加载程序,该文件没有打开,而是一个打开了其图标的 cmd。如何让exe正常执行?
    • 先试试看 - cmd /C "C:\Users\Bob Builder\Desktop\New Folder\test.exe"
    • 虽然需要引号是一个很好的指针,但您的 start 命令已损坏 - 双引号路径被解释为 窗口标题,并且该程序是启动默认为cmd.exe。我知道您只是建立在 OP 自己的尝试之上,但还值得指出的是,您既不需要来自 cmd.exe 也不需要来自 PowerShell 的 cmd /c。尽管在 PowerShell 中,startStart-Process 的别名,但start "C:\Users\Bob Builder\Desktop\New Folder\test.exe" 将按原样工作。所有这些都假设意图是在新窗口异步启动。
    【解决方案3】:

    似乎 cmd 对我不起作用。 Powershell 使用此脚本:

    $env:Path += ";C:\Users\Bob Builder\Desktop\New Folder\"
    test.exe
    

    【讨论】:

    • 来自cmd.exe,使用"C:\Users\Bob Builder\Desktop\New Folder\test.exe"。虽然您的 PowerShell 变通办法很有效,但您不需要变通办法;使用& 'C:\Users\Bob Builder\Desktop\New Folder\test.exe'
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多