如何 运行 文件路径中包含空格的 bat 文件?

How can I run a bat file with spaces in the filepath?

我想 运行 一个用于在 Windows 机器上从 Kotlin 程序中将 sass 编译成 css 的 bat 文件。在我切换到用户名中包含 space 的 Windows 帐户之前,我使用 Runtime.exec 一切正常。根据我的阅读,我读到使用 ProcessBuilder 会使这更容易。似乎即使 ProcessBuilder 我仍然无法让它工作,无论我尝试什么。

到目前为止,这是我的代码

val commands = mutableListOf(
                "cmd",
                "/c",
                "C:\Users\John Doe\VCS\test\tools\sass\windows\dart-sass\sass.bat",
                "--no-source-map",
                "C:\Users\John Doe\VCS\test\src\main\sass\global.scss",
                "global.css"
        )

val processBuilder = ProcessBuilder(commands)
val process = processBuilder.start()

...

我得到的错误是 'C:\Users\John' is not recognized as an internal or external command, operable program or batch file. 如果我用 \".

包围具有 space 的字符串,它没有帮助

如果我没记错的话,名称中包含 space 的所有 windows 文件和文件夹都有一个匹配的旧 8.3 格式的短名称,替换额外的 space 和其他字符带有波浪号 (~) 和数字。

因此,无论 return 向您提供 .bat 和 .sscs 文件的路径,都可以 return 该格式的完整文件名吗?

不解决问题反而回避问题,我承认。

也意味着当有人在文件名中输入 space 时您不会被抓到(好吧,不太可能,但从一开始就更好地处理)。

考虑the top 2 answers on this superuser thread

这实际上是一个 Windows cmd 问题。 The question here showscmd 中,除了引用文件路径外,还必须引用 /c 开关后的整个命令行文本部分。

我不知道这是否是在 ProcessBuilder 中执行此操作的最佳方法,但我能够使用以下代码使其工作。

"cmd.exe",
                "/c",
                "\"\"C:/Users/John Doe/VCS/test/tools/sass/windows/dart-sass/sass.bat\" "
                + "--no-source-map "
                + "\"C:/Users/John Doe/VCS/test/src/main/sass/global.scss\" "
                + "\"global.css\"\""