AHK 脚本在 C:\ 目录中不打开终端,但在其他目录中打开

AHK Script doesn't open terminal in C:\ Directory, but does in others

首先是我的代码:

#t::
IfWinActive, ahk_class CabinetWClass ; If explorer is active
{
    path := GetActiveExplorerPath()
    Run wt.exe -d "%path%"
}
else 
{
    Run wt.exe
}
Return

;  
GetActiveExplorerPath() {
    explorerHwnd := WinActive("ahk_class CabinetWClass")
    if (explorerHwnd)
    {
        for window in ComObjCreate("Shell.Application").Windows
        {
            if (window.hwnd==explorerHwnd)
                return window.Document.Folder.Self.Path
        }
    } 
}

现在,如果我按 [Superkey] + [t],终端将按预期打开。但是,如果路径变量中有 space,即 C:\Users\user\AHK Macros.

,则会出现错误

解决这个问题应该很容易(用双引号引起来)并且有效。现在的问题是在C:\目录下打开终端会报错。我认为它与 C:\ 以“\”结尾,从而转义引号有关。虽然不确定。我试过用 3/4 引号将它包起来。用 MsgBox 打印它确实给出了所需的 "C:/" 结果,如果我省略引号,我可以打开 C:/ 。我忽略了什么?

您确实需要转义最后一个反斜杠。
例如
Run, % "wt.exe -d ""C:\""" (旧语法 Run, wt.exe -d "C:\" 不合适
但是
Run, % "wt.exe -d ""C:\""" (旧语法 Run, wt.exe -d "C:\" 没问题。

例如,您可以检查路径是否以 \ 结尾(我认为应该只发生在驱动器根目录中) 然后添加一个额外的反斜杠:

#t::
    if (WinActive("ahk_exe Explorer.EXE ahk_class CabinetWClass"))
    {
        path := GetActiveExplorerPath()
        if (SubStr(path, 0) == "\") ;get last character
            path .= "\"
        path := StrReplace(path, ";", "\;") ;semicolon needs to be escaped
        Run, % "wt.exe -d """ path """"
    }
    else 
    {
        Run, % "wt.exe"
    }
return

你会注意到我也转义了 ;,这也需要完成,因为它在 wt 启动参数中分隔命令。

SubStr()(docs)
StrReplace()(docs)