2012-09-07 251 views
1

你能告诉我为什么这段代码给出错误吗?从另一个文本文件的一行创建一个新文件(名称)

我不理解这行:File.new("#{line}", "w")

system "ipconfig /all > info.txt" 
info_text = File.open("info.txt") 
info_text.each { |line| 
    if line =~ /Physical Address/ 
    line.slice! " Physical Address. . . . . . . . . : " 
    File.new("#{line}", "w") 
    end 
} 

感谢-MikeW¯¯

+0

注:您的'使用File.new'保持文件句柄开放,直到脚本退出。虽然短命的脚本并不是什么大不了的。 – Kelvin

回答

0

的代码被设计为在Microsoft Windows上运行。该脚本不会对其他操作系统有用。特别是,它会尝试使用MAC地址为系统上的每个网络适配器创建一个空文件。

很可能line包含Windows不允许在文件名中包含的字符。 (Windows比Linux或Mac OS X更具有限制性。)您遇到的错误是什么?

此外,请在致电File.new之前立即尝试打印line变量以查看其中包含的内容。

您可能需要通过删除无效字符来清理line。有关不允许的内容,请参阅this answer。简单的方法是使用一个简单的白名单:

# remove non-alphanumeric and non-underscore 
line.gsub!(/\W/, '') 

我怀疑这是导致错误的换行符。

UPDATE:

我做了Windows上的测试,它的的确回车(\r)和换行(\n)导致的问题。我得到Errno::EINVAL: Invalid argument

这应该修复它,通过删除所有空白:

line.gsub!(/[\s]/, '') 
+0

感谢line.gsub!(/ [\ s] /,'')解决了这个问题。 – Mike

相关问题