在Windows中的ruby中,执行cmd提示命令“ move”会给出错误“命令的语法不正确”。

时间:2019-03-10 00:06:14

标签: ruby windows cmd

在Windows中的ruby中,执行cmd提示命令“ move”会给出错误“命令的语法不正确。”

但是它在红宝石之外工作

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>

上面所有这些都很好并且可以预期。

注意,我永远不会收到错误消息:“命令的语法不正确。”

然后尝试红宝石

我有一个只有一行的简单文件

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 个答案:

答案 0 :(得分:2)

这里的问题可能是反斜杠,它在插值的Ruby字符串内部具有重要意义,双引号也带有反引号样式的shell命令。

因此,您的命令被解释为:

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

其中^I"\t",它是一个制表符,而^G"\a",它是bell character

相反:

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

现在请记住,Ruby有一个非常全面的函数库,您可以使用该函数库直接解决此问题。不要把它当作花哨的shell脚本语言来对待:

require 'fileutils'

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

在这里,我使用单引号来避免双反斜杠,并且force: true等效于/y。它使用FileUtils.mv,它是有用的文件和目录操作实用程序的整个软件包的一部分。

此外,如果出现问题,您还将获得适当的例外;如果移动失败,则将获得错误代码。

由barlop添加

确认以上内容。双反斜杠可以解决此问题,我可以通过执行puts`echo copy / yc:\ techprogs ...`看到单反斜杠会发生什么情况,我看到随着c:\techprogs成为c:<ascii-9>echprogs.的情况,techprogs也被删除了\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>