重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。
OSはWindows2000,WSHは5.6を使用しています。
WSH(VBScript)で、同一PC内にあるローカルユーザー「suzuki」のマイドキュメントにある全てのファイル、
フォルダ(サブフォルダ)を「takada」に複写したい
のですが、最初はコピーできるのですが、2度目以降、
は既に存在しているのでコピーできません(エラーと
なります)。
(スクリプトが分からないので)存在チェックはしており
ませんが、どのようにコーディングすればよろしいでしょ
うか?
どうぞよろしくお願いいたします。

A 回答 (5件)

>My Picturesフォルダは何度でもコピーされるのですが、



「My Picturesフォルダが」ではなく、「My Picturesフォルダの内容が」ですよね、おそらく。

失敗している原因は、コピーしたMy Picturesが読取専用属性になっているためです。

なので、VBSでコピーする前に、自分で読取専用属性を外してください。

もしくは、VBSの中で、コピー前に読取専用属性を外す処理を追加するか。

#もちろん、My Picturesフォルダ以外にも読取専用の属性がついているファイルやフォルダがあったらしっぱいしますんで。

この回答への補足

take_tetsuさん、こんにちは。
今ほど気づいたのですが、コピー元
が読み取り専用となっているフォルダをコピー
するとコピー先では標準となってしまいました。
次から次へと問題が発生しますが、何か分かり
ましたら今一度ご教授願いたいと思います。
よろしくお願いいたします。

補足日時:2004/03/05 11:32
    • good
    • 0
この回答へのお礼

take_tetsuさん、こんにちは。
ご指摘の通り、フォルダの属性は標準でしたが
その中にある一部のファイルが読取専用となって
おりました!!
どうもありがとうございました!!!

お礼日時:2004/03/05 09:12

まだ締め切ってなかったので、最終的な回答を。


ただし、VBスクリプトじゃなく、JScriptですが。
どうしてもVBスクリプトがよければ、書き直しますが。
ご自身の環境に合わせて、細部を書き直してください。
っと、聞くばっかりでなく、自分で考えることも必要だと思います。
そうしないと、いつまでたってもつらいだけですよ。

ファイルのコピー権限は、何ででしょうねぇ?
自分のところがWindows2000"Server"だからかな?
ま、いいか。

varshell = null ;
varfileSystemObject = null ;
varsourceFolderInformation = null ;
varsourceFolder = null ;
vardestinationFolderInformation = null ;
vardestinationFolder = 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( "完了" ) ;

functionchangeReadAttribute( folder )
{
varenumerator = 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( ) ) ;
}
}
    • good
    • 0
この回答へのお礼

syulenさん、こんにちは。
詳細なスクリプトありがとうございます。
「聞くばっかりでなく、自分で考えることも
必要だと思います」はおっしゃられる通りで
反省しております。
VBScriptはある程度「読める」のですが、
JScriptは分かりませんが雰囲気は掴めました。
どうもありがとうございました。

お礼日時:2004/03/05 11:32

ちょっと確認してみてください。


User1からUser2へコピーすることを考えます。
User1、User2ともにPowerUser権限ですよね。
まず、User2へログオンします。
そしてスクリプトを実行します。
っと、普通なら個の段階で、PowerUser同士であれば、
「書き込みできません」
のエラーが出るはずです。
実際には、読み込みもとのソースコードを読む権限がなく、ファイルが読み込めないので、コピーできない、ということですが。

実際に環境を構築して試して見ましたので、間違いないと思います。
はじめの一回目を実行するユーザーの権限は、
[Administrator]ではないですか?
[My Documents]フォルダは、ユーザー個別のフォルダで、
他のユーザーは読み書きできないと思いますが。
いかがでしょう?

また、Administrator権限であったとき、2度目にコピーできない理由を考えてみます。
答えは簡単。
User1側の新規作成ファイルまたはディレクトリが読取専用だからです。
ディレクトリコピーでは、その属性もコピーされます。
User1で新規に作成したフォルダやファイルが読取専用であった場合、コピー先のファイルも読取専用となります。
2回目のコピーは、読取専用のファイルやフォルダに対して上書きを試みることになるので、失敗するということです。

今のところは、読取専用属性を持つファイルへの強制上書きを行うオプションはありませんので、元ファイルの読取専用属性を解除する、というのが、問題解決方法となるでしょうか。

それでは。
    • good
    • 0
この回答へのお礼

syulenさん、こんにちは。
ユーザーの権限はどちらも、Power Usersです。
Power Users同士であればコピーできるようです。
ただ、2回目の失敗は、お察しのとおり、読み取り
専用となっているファイルが存在していたための
ようでした!
読取専用ファイルに直接上書きができれば楽なん
ですけどねー(それでは読取専用属性が無意味と
なってしまいますけどね)。
どうもありがとうございました。

お礼日時:2004/03/05 09:09

http://www.interq.or.jp/student/exeal/dss/ref/ws …

CopyFolderの第3パラメータをTrueにするだけ。

参考URL:http://www.interq.or.jp/student/exeal/dss/ref/ws …

この回答への補足

taka_tetsuさん、こんにちは。
回答ありがとうございます。
"FS.CopyFolder M, F,True"
としましたが、やはり書き込みできません
となります。因みに、
"FS.CopyFolder M, F,False"
とすると既に同じファイルが存在しています
となります。
コピーできないフォルダの属性は変更してあり
ませんし、コピー元・先ともPower Usersです。
引き続きよろしくおねがいいたします。

補足日時:2004/03/04 15:35
    • good
    • 0

どういったスクリプトでコピーをしているのでしょうか?

この回答への補足

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度目以降実行するとエラーになってしまいます(書き込みできませんとなります)。
よろしくお願いいたします。

補足日時:2004/03/04 14:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!