- ベストアンサー
WSHでファイルとフォルダのコピーをしたい
こんにちは。 OSはWindows2000,WSHは5.6を使用しています。 WSH(VBScript)で、同一PC内にあるローカルユーザー「suzuki」のマイドキュメントにある全てのファイル、 フォルダ(サブフォルダ)を「takada」に複写したい のですが、最初はコピーできるのですが、2度目以降、 は既に存在しているのでコピーできません(エラーと なります)。 (スクリプトが分からないので)存在チェックはしており ませんが、どのようにコーディングすればよろしいでしょ うか? どうぞよろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>My Picturesフォルダは何度でもコピーされるのですが、 「My Picturesフォルダが」ではなく、「My Picturesフォルダの内容が」ですよね、おそらく。 失敗している原因は、コピーしたMy Picturesが読取専用属性になっているためです。 なので、VBSでコピーする前に、自分で読取専用属性を外してください。 もしくは、VBSの中で、コピー前に読取専用属性を外す処理を追加するか。 #もちろん、My Picturesフォルダ以外にも読取専用の属性がついているファイルやフォルダがあったらしっぱいしますんで。
その他の回答 (4)
- syulen
- ベストアンサー率71% (5/7)
まだ締め切ってなかったので、最終的な回答を。 ただし、VBスクリプトじゃなく、JScriptですが。 どうしてもVBスクリプトがよければ、書き直しますが。 ご自身の環境に合わせて、細部を書き直してください。 っと、聞くばっかりでなく、自分で考えることも必要だと思います。 そうしないと、いつまでたってもつらいだけですよ。 ファイルのコピー権限は、何ででしょうねぇ? 自分のところがWindows2000"Server"だからかな? ま、いいか。 var shell = null ; var fileSystemObject = null ; var sourceFolderInformation = null ; var sourceFolder = null ; var destinationFolderInformation = null ; var destinationFolder = null ; shell = WScript.CreateObject( "WScript.Shell" ) ; fileSystemObject = WScript.CreateObject( "Scripting.FileSystemObject" ) ; destinationFolderInformation = shell.SpecialFolders( "MyDocuments" ) ; destinationFolder = fileSystemObject.GetFolder( destinationFolderInformation ) ; sourceFolderInformation = "C:\Documents and Settings\user1\My Documents" sourceFolder = fileSystemObject.GetFolder( sourceFolderInformation ) ; changeReadAttribute( sourceFolder ) ; fileSystemObject.CopyFolder( sourceFolderInformation , destinationFolder ) ; shell.Popup( "完了" ) ; function changeReadAttribute( folder ) { var enumerator = null ; for( enumerator = new Enumerator( folder.Files ) ; false == enumerator.atEnd( ) ; enumerator.moveNext( ) ) { enumerator.item( ).Attributes = 0 ; } for( enumerator = new Enumerator( folder.SubFolders ) ; false == enumerator.atEnd( ) ; enumerator.moveNext( ) ) { enumerator.item( ).Attributes = 0 ; changeReadAttribute( enumerator.item( ) ) ; } }
お礼
syulenさん、こんにちは。 詳細なスクリプトありがとうございます。 「聞くばっかりでなく、自分で考えることも 必要だと思います」はおっしゃられる通りで 反省しております。 VBScriptはある程度「読める」のですが、 JScriptは分かりませんが雰囲気は掴めました。 どうもありがとうございました。
- syulen
- ベストアンサー率71% (5/7)
ちょっと確認してみてください。 User1からUser2へコピーすることを考えます。 User1、User2ともにPowerUser権限ですよね。 まず、User2へログオンします。 そしてスクリプトを実行します。 っと、普通なら個の段階で、PowerUser同士であれば、 「書き込みできません」 のエラーが出るはずです。 実際には、読み込みもとのソースコードを読む権限がなく、ファイルが読み込めないので、コピーできない、ということですが。 実際に環境を構築して試して見ましたので、間違いないと思います。 はじめの一回目を実行するユーザーの権限は、 [Administrator]ではないですか? [My Documents]フォルダは、ユーザー個別のフォルダで、 他のユーザーは読み書きできないと思いますが。 いかがでしょう? また、Administrator権限であったとき、2度目にコピーできない理由を考えてみます。 答えは簡単。 User1側の新規作成ファイルまたはディレクトリが読取専用だからです。 ディレクトリコピーでは、その属性もコピーされます。 User1で新規に作成したフォルダやファイルが読取専用であった場合、コピー先のファイルも読取専用となります。 2回目のコピーは、読取専用のファイルやフォルダに対して上書きを試みることになるので、失敗するということです。 今のところは、読取専用属性を持つファイルへの強制上書きを行うオプションはありませんので、元ファイルの読取専用属性を解除する、というのが、問題解決方法となるでしょうか。 それでは。
お礼
syulenさん、こんにちは。 ユーザーの権限はどちらも、Power Usersです。 Power Users同士であればコピーできるようです。 ただ、2回目の失敗は、お察しのとおり、読み取り 専用となっているファイルが存在していたための ようでした! 読取専用ファイルに直接上書きができれば楽なん ですけどねー(それでは読取専用属性が無意味と なってしまいますけどね)。 どうもありがとうございました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
http://www.interq.or.jp/student/exeal/dss/ref/wsh/scripting/filesystemobject.html#CopyFolder CopyFolderの第3パラメータをTrueにするだけ。
補足
taka_tetsuさん、こんにちは。 回答ありがとうございます。 "FS.CopyFolder M, F,True" としましたが、やはり書き込みできません となります。因みに、 "FS.CopyFolder M, F,False" とすると既に同じファイルが存在しています となります。 コピーできないフォルダの属性は変更してあり ませんし、コピー元・先ともPower Usersです。 引き続きよろしくおねがいいたします。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
どういったスクリプトでコピーをしているのでしょうか?
補足
taka_tetsuさん、こんにちは。 スクリプトは以下の通りです。 ************************************************ Option Explicit Dim WSell,F,X,MyDoc,M Set WSell = CreateObject("WScript.Shell") MyDoc = WSell.SpecialFolders("MyDocuments") Set X = CreateObject("Scripting.FileSystemObject") Set F = X.GetFolder(MyDoc) M = "C:\Documents and Settings\user1\My Documents" X.CopyFolder M, F msgbox "完了" ************************************************ 「user1」のマイドキュメントをログオンしたユーザーの マイドキュメントにコピーしたいのです。 ファイルや、My Picturesフォルダは何度でもコピーされ るのですが、新規で作成したフォルダは2度目以降実行するとエラーになってしまいます(書き込みできませんとなります)。 よろしくお願いいたします。
お礼
take_tetsuさん、こんにちは。 ご指摘の通り、フォルダの属性は標準でしたが その中にある一部のファイルが読取専用となって おりました!! どうもありがとうございました!!!
補足
take_tetsuさん、こんにちは。 今ほど気づいたのですが、コピー元 が読み取り専用となっているフォルダをコピー するとコピー先では標準となってしまいました。 次から次へと問題が発生しますが、何か分かり ましたら今一度ご教授願いたいと思います。 よろしくお願いいたします。