При выполнении команды ruby ​​в Windows выполнение командной строки cmd «move» приводит к ошибке «Синтаксис команды неверен». - PullRequest
0 голосов
/ 10 марта 2019

в ruby ​​в Windows при выполнении команды приглашения cmd 'move' выдается ошибка "Синтаксис команды неверен."

Но это работает за пределами ruby ​​

C:\rubytest>echo asdf>c:\techprogs\azzz.azz

C:\rubytest>del c:\techprogs\azzz.azz

C:\rubytest>echo asdf>c:\techprogs\azzz.azz

C:\rubytest>move /y c:\techprogs\azzz.azz c:\techprogs\autorun.bat
        1 file(s) moved.

C:\rubytest>move /y c:\techprogs\azzz.azz c:\techprogs\autorun.bat
The system cannot find the file specified.

C:\rubytest>

Все вышеперечисленное прекрасно и ожидаемо.

Обратите внимание, что я никогда не получаю сообщение об ошибке «Синтаксис команды неверен».

Тогда попробуйте в ruby ​​

У меня есть простой файл с одной строкой

C:\rubytest>type syntaxcommandincorrect.rb
`move /y c:\techprogs\azzz.azz c:\techprogs\autorun.bat`

C:\rubytest>

Но это дает ошибку об синтаксисе

C:\rubytest>del c:\techprogs\azzz.azz

C:\rubytest>ruby syntaxcommandincorrect.rb
The syntax of the command is incorrect.

C:\rubytest>echo asdf>c:\techprogs\azzz.azz

C:\rubytest>ruby syntaxcommandincorrect.rb
The syntax of the command is incorrect.

C:\rubytest>

1 Ответ

2 голосов
/ 10 марта 2019

Проблема здесь, вероятно, заключается в обратном слэше, который имеет значительное значение внутри интерполированных строк Ruby, двойных кавычек, но также и команд оболочки в стиле backtick.

Таким образом, ваша команда интерпретируется как:

move /y c:^Iechprogs^Gzzz.azz c:^Iechprogs^Gutorun.bat

Где ^I - это "\t", который является символом табуляции, а ^G - это "\a", который является символом колокольчика .

Вместо того, чтобы:

`move /y c:\\techprogs\\azzz.azz c:\\techprogs\\autorun.bat`

Теперь помните, что в Ruby есть очень обширная библиотека функций, которую вы можете использовать для непосредственного решения этой проблемы. Не относитесь к этому как к необычному языку сценариев оболочки:

require 'fileutils'

FileUtils.mv('c:\techprogs\azzz.azz', 'c:\techprogs\autorun.bat', force: true)

Где здесь я использую одинарные кавычки, чтобы избежать двойной обратной косой черты, а force: true является эквивалентом /y. При этом используется FileUtils.mv, часть целого пакета полезных утилит для работы с файлами и каталогами.

В качестве плюса вы также получаете правильные исключения, если что-то идет не так, или код ошибки, если перемещение не удалось.

Добавлено barlop

Подтверждение вышесказанного. Двойная обратная косая черта исправляет это, и я вижу, что с помощью команды put `echo copy / yc: \ techprogs ...` что происходит с одиночной обратной косой чертой, я вижу, что t techprogs удалено, так как c:\techprogs стало c:<ascii-9>echprogs. И \autorun стало <ascii-7>utorun

C:\rubytest>cmdoutoutwithoutinitbat.rb | xxd
0000000: 6162 6364 6566 670d 0a63 6f70 7920 2f79  abcdefg..copy /y
0000010: 2063 3a09 6563 6870 726f 6773 0775 746f   c:.echprogs.uto
0000020: 7275 6e2e 6261 7420 633a 0965 6368 7072  run.bat c:.echpr
0000030: 6f67 7307 7a7a 7a2e 617a 7a0d 0a61 6263  ogs.zzz.azz..abc
0000040: 6465 6667 0d0a 6d6f 7665 202f 7920 633a  defg..move /y c:
0000050: 0965 6368 7072 6f67 7307 7a7a 7a2e 617a  .echprogs.zzz.az
0000060: 7a20 633a 0965 6368 7072 6f67 7307 7574  z c:.echprogs.ut
0000070: 6f72 756e 2e62 6174 0d0a                 orun.bat..

C:\rubytest>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...