Ruby 打开 Windows 上 shell 中带空格的文件名

Ruby open file name with spaces from the shell on Windows

因此,我可以使用 ruby 和 system("start filename") 打开 shell 中的文件。但是,当文件上有 space 时,它不起作用,即使我添加了转义符 \,或者如果我使用 shellescape。

显然,一种方法是先获取文件的 8.3 短名称,但试过了,但没有成功。有谁知道在这种情况下我怎样才能简单地逃避 space ?我当前的代码如下所示:

    require 'shellwords'
    filename = "#{$filenamewithspaces}.docx".shellescape
    system("start #{filename}")

非常感谢!

在变量替换中删除美元符号:

filename = "#{$filenamewithspaces}.docx".shellescape

一个提示是始终在命令行中启动 irb 并测试每个命令:

2.4.1 :001 > filenamewithspaces = "string with spaces"
 => "string with spaces"
2.4.1 :002 > "#{$filenamewithspaces}"
 => ""
2.4.1 :003 > "#{filenamewithspaces}"
 => "string with spaces"

shellescape 在 Windows 上无效。在 Windows 上,您可以使用引号将复杂的文件名括起来。另请注意,如果使用引号,则需要向 start 提供两个参数,因为第一个参数被解释为命令 window title:

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/AFFINITY ] [/WAIT] [/B] [command/program] [parameters]

解决这些问题的最简单方法是使用 system 的多参数版本:

system('start', '', $filenamewithspaces)

如果一定要使用单参数版本,那么:

system("start \"\" \"#{$filenamewithspaces}\"")

...如您所见,它更丑陋且可读性更差。

filename="my filename should not have spaces but it does.exe"
system("cmd","/c","start",filename)

我明确地写了 "cmd",这样它就可以与 Ruby 一起使用,Windows 和 Cygwin 的 Ruby。

如果没有令人信服的理由将整个命令作为单个字符串传递,我将始终将参数作为数组单独传递。