Ruby открывает имя файла с пробелами из оболочки в Windows - PullRequest
0 голосов
/ 20 мая 2018

Итак, я могу открывать файлы из оболочки, используя ruby ​​с system("start filename").Однако, когда в файле есть пробел, он не работает, даже если я добавляю escape \ или если я использую shellescape.

По-видимому, одним из методов было бы сначала получить короткое имя файла 8.3, но попыталось это сделать и не удалось.Кто-нибудь знает, как я могу просто избежать пробела в этой ситуации?Мой текущий код выглядит так:

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

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

shellescape недопустимо в Windows.В Windows вы можете использовать кавычки для заключения сложных имен файлов.Также обратите внимание, что если вы используете кавычки, вам нужно предоставить два аргумента для start, так как первый параметр интерпретируется как заголовок окна команды:

START ["title"] [/ D путь] [/ I] [/ MIN] [/ MAX] [/ SEPARATE |/ ПОДЕЛИТЬСЯ] [/ LOW |/ НОРМАЛЬНЫЙ |/ ВЫСОКИЙ |/ РЕАЛЬНОЕ ВРЕМЯ |/ ABOVENORMAL |/ BELOWNORMAL] [/ AFFINITY] [/ WAIT] [/ B] [команда / программа] [параметры]

Самый простой способ обойти эти проблемы - использовать многопараметрическую версию system:

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

Если вам необходимо использовать однопараметрическую версию, то:

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

... что гораздо уродливее и менее читабельно, как вы можете видеть.

0 голосов
/ 21 мая 2018
filename="my filename should not have spaces but it does.exe"
system("cmd","/c","start",filename)

Я явно пишу "cmd", чтобы он работал как с Ruby, как для Windows, так и с Ruby для Cygwin.

Если нет веских причин для передачи всей команды какодна строка, я бы всегда передавал аргументы индивидуально как массив.

0 голосов
/ 20 мая 2018

Удалите знак доллара в подстановке переменных:

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