【问题标题】:in ruby in windows, executing the cmd prompt command 'move' gives error "The syntax of the command is incorrect."在 Windows 中的 ruby​​ 中,执行 cmd 提示命令“move”会给出错误“命令的语法不正确”。
【发布时间】:2019-03-10 00:06:14
【问题描述】:

在windows的ruby中,执行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>

【问题讨论】:

  • 记住反引号内的反斜杠有特殊含义,需要转义。考虑:move /y c:\\techprogs ...
  • @tadman 谢谢,大概就是这样,等我回到那台电脑上去看看

标签: ruby windows cmd


【解决方案1】:

这里的问题可能是在插入的 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 /y c:\techprogs...` 看到单反斜杠会发生什么,我看到 techprogs 的 t 被删除,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>

【讨论】:

  • 我将测试这个反斜杠。但这并不能解释为什么在 ruby​​ 中 this 没有给出错误 copy c:\techprogs\azzz.azz c:\techprogs\autorun.bat 另外,在 cmd 提示符下执行 move /y c:^techprogs^azzz.azz c:^techprogs^autorun.bat 会说 The system cannot find the file specified. 它没有说明语法错误
  • ^I^A 仅用于说明目的,实际上并不是您要输入的内容。
  • 您也可以尝试 system('move', '/y', 'c:\techprogs\azzz.azz', 'c:\techprogs\autorun.bat') 使用具有单独参数的 system 调用,但出于多种原因,诚实地使用 FileUtils 会更好。
  • 那么 ruby​​ 向 cmd 发送什么会导致语法错误呢?
  • 尝试使用echo 来查看。
猜你喜欢
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多