-1

IRB端末から実行したコードを見つけてください。

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\rakshiar>irb
irb(main):001:0> src = 'E:\WIPData\Ruby\Scripts\TaxDocumentDownload'
=> "E:\\WIPData\\Ruby\\Scripts\\TaxDocumentDownload"
irb(main):002:0> dest = 'E:\WIPData\Ruby\Scripts'
=> "E:\\WIPData\\Ruby\\Scripts"
irb(main):003:0> dest<<'H00371101'
=> "E:\\WIPData\\Ruby\\ScriptsH00371101"
irb(main):004:0>

なぜここ\\に来ているのですか?それを修正する方法は?

スクリプトから同じ部分を実行すると、以下の警告が表示されます:

コード

src = 'E:\WIPData\Ruby\Scripts\TaxDocumentDownload'
dest = 'E:\WIPData\Ruby\Scripts'
dest<<'H00371101'
FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)

警告:

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\rakshiar>cd..

C:\Documents and Settings>cd..

C:\>e:

E:\>cd E:\WIPData\Ruby\Scripts

E:\WIPData\Ruby\Scripts>downloadv1.rb
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:93: warning: already initialized constant
 OPT_TABLE
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1268: warning: already initialized consta
nt S_IF_DOOR
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1496: warning: already initialized consta
nt DIRECTORY_TERM
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1500: warning: already initialized consta
nt SYSCASE
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1619: warning: already initialized consta
nt LOW_METHODS
C:/Ruby193/lib/ruby/1.9.1/FileUtils.rb:1625: warning: already initialized consta
nt METHODS

なぜそのような警告が出てくるのか教えてください。

IRBもう一度別の出力から以下を試すと:

C:\Documents and Settings\rakshiar>irb
irb(main):001:0> src = "E:\WIPData\Ruby\Scripts\TaxDocumentDownload"
=> "E:WIPDataRubyScriptsTaxDocumentDownload"
irb(main):002:0> est = "E:\WIPData\Ruby\Scripts"
=> "E:WIPDataRubyScripts"
irb(main):003:0> est<<"H00371101"
=> "E:WIPDataRubyScriptsH00371101"
irb(main):004:0> est<<"H00371101"

編集:

エラー

E:\WIPData\Ruby\Scripts>downloadv1.rb
E:/WIPData/Ruby/Scripts/downloadv1.rb:87: syntax error, unexpected tCONSTANT, ex
pecting $end
dest<<"H00371101"
                ^

スクリプトコード部分から:

src = "E:\WIPData\Ruby\Scripts\TaxDocumentDownload"
dest = "E:\WIPData\Ruby\Scripts\"
dest<<"H00371101"
FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)

そのsrc and destディレクトリを実際のディレクトリ パスとして使用します。それを取得する方法は?

ありがとう。

4

2 に答える 2

3

Ruby には、大きく分けて 2 種類の文字列があります。二重引用符で囲まれた文字列では、バックスラッシュは「エスケープ」文字です。バックスラッシュの後に別の文字が続くと、特殊文字が生成されます。たとえば"\n"、改行を提供します。単一引用符で囲まれた文字列内では、バックスラッシュは文字をエスケープしません。'\n'バックスラッシュの後に文字が続くだけnです。(実際には、これは 100% 真実ではありません。例外は'\''単一引用符です。それ以外の場合、単一引用符で囲まれた文字列に単一引用符を埋め込む方法はありません。

そのため、単一引用符src = 'E:\WIPData\Ruby\Scripts\TaxDocumentDownload'は機能し、二重引用符は機能しsrc = "E:\WIPData\Ruby\Scripts\TaxDocumentDownload"ません。

二重バックスラッシュがそこに出力されるのは、結果の出力irbを使用inspectするためです。これは、文字列を二重引用符で囲まれた形式 (特殊文字はエスケープされています) で返します。

'"Hello," said Andy'.inspect # => "\"Hello,\" said Andy"

でわかるように、それらは実際には文字列には含まれていませんputs:

puts '"Hello," said Andy' # => "Hello," said Andy

あなたが持っているエラーは、二重引用符で囲まれた文字列を使用しているためです。バックスラッシュはエスケープ文字として扱われるため、文字列は終了していません:

src = "E:\WIPData\Ruby\Scripts\"
dest<<"H00371101"

と同じように解析されます

src = 'E:WIPDataRubyScripts"dest<<'H00371101

これは構文エラーです。

一重引用符と二重引用符で囲まれた文字列の違いについて読んでください。ここに 1 つのリソースがあります。


require 'FileUtils'簡単なグーグルは、あなたがしていない可能性があることを示唆していrequire 'fileutils'ますか? この投稿は、後者に変更すると同じ警告が消えたと述べています。これは、Windows のファイル システムでは大文字と小文字が区別されないためです。Ruby では、FileUtils.rb と fileutils.rb は 2 つの異なるファイルですが、Windows では同じです。

于 2013-01-24T11:45:35.490 に答える