如何使用ruby程序调用ms paint来打开多个文件?

时间:2013-11-18 01:38:44

标签: ruby

我观察到以下代码有助于为特定文件调用mspaint:

print("mspaint  #{%x{mspaint c:/image/a.jpg}}")# 

我在文件夹中有许多JPG文件:D:/ Users / d682707 / Desktop / Fotos / Frankston / Pics 而且,我想在for循环中打开MS PAINT中的每个文件。下面的代码抛出一个弹出错误,说Paint没有找到D:/ Users / d682707 / Desktop / Fotos / Frankston / Pics / files [i] .png!

for i in 2..(@files.size-1)
puts(@files[i] + " #{File.size(@files[i])} bytes")  
print("mspaint  #{%x{mspaint D:/Users/d682707/Desktop/Fotos/Frankston/Pics/files[i]}}")

我怎样才能做到这一点?除此之外,如何在MS PAINT中自动执行操作 - 例如,单击PAINT中的调整大小按钮?

1 个答案:

答案 0 :(得分:1)

有几个问题,但主要问题是:

%x{ mspaint D:/Users/d682707/Desktop/Fotos/Frankston/Pics/files[i] }

%x{}的内容与双引号内的字符串相同。可以将变量插入到该字符串中,但它们必须使用围绕变量的#{...}标记。

上述内容可以写成:

%x{ mspaint D:/Users/d682707/Desktop/Fotos/Frankston/Pics/#{ files[i] } }

但是,这不会导致代码易于理解,从而导致维护时出现问题。相反,我写道:

print("mspaint  #{ %x{ mspaint D:/Users/d682707/Desktop/Fotos/Frankston/Pics/files[i] } }")

不同。

改为默想:

output = `%x{ mspaint D:/Users/d682707/Desktop/Fotos/Frankston/Pics/#{ files[i] }`
print("mspaint #{ output }")

而不是多个嵌套大括号({...}),为了便于阅读,它们被解开了一些。没有理由把所有东西塞进一条线;它不会加速代码的处理,它肯定会伤害可读性和长期可维护性,所以要善待你的眼睛和大脑,以及那些可能跟随你的脚步阅读代码的人。

但是,还有更多:不要使用for i in 2..(@files.size-1)。这太复杂了,而for离开i后面会无缘无故地混淆命名空间。而是使用:

@files[2 .. -1].each do |i|

output = `%x{ mspaint D:/Users/d682707/Desktop/Fotos/Frankston/Pics/#{ i }`

each执行相同的操作,但在块内包含局部变量i,因此可以在块退出后将其丢弃。它还避免了使用索引的整个(@files.size-1)乱码,因为i现在包含值本身而不是索引。尝试通过索引遍历元素是各种语言中无数索引的数组末尾错误的来源。在Ruby中我们不这样做,因为我们有更好的方法,所以请改用each

将这些结合起来会导致:

@files[2..-1].each do |i|
  output = `%x{ mspaint D:/Users/d682707/Desktop/Fotos/Frankston/Pics/#{ i }`
  print("mspaint #{ output }")
end