教えて!goo限定 1000名様に電子コミック1000円分が当たる!!

いつもお世話になっております。

表題に関してなのですが、VBSでFileSystemObjectを利用してフォルダを作り、
そのフォルダにファイルをコピーするという内容のスクリプトを作成しています。

ですが、フォルダは無事に出来るのですが、ファイルをコピーしようとすると、
「書き込み出来ません」
と出て、コピーされません。
fso.CopyFileのところで、エラーが発生してるようです。

CopyFileメソッドの代わりにCopyコマンドで実行するように記述すると
問題なくコピーされます。

解決方法等ございましたら、ご教授ねがいます。

A 回答 (2件)

多分#1のご回答で解決と思うが。


そもそもエラーの、原因が判るものは(エラーコードと原因が1義的なもの)限られる。
デバッグで、いままで苦労したことないのではないですか。大体他人に説明して、デバッグをやってもらってわかるようなものは初歩的なものだ。
それにそのフォルダの実在、コピー元ファイルの(実行直前状態で)実在確認なども念のためすませるものだ。
どうなっているのかな。
    • good
    • 0

CopyFile メソッドの構文を確認しましょう。

(下記ページ)
http://www.mhl.janis.or.jp/~winarrow/vbscript/ht …

<ご参考>
c:\temp\etc 配下のテキストファイルを c:\temp にコピーする例です。
Dim fso,gtf
set fso = CreateObject("Scripting.FileSystemObject")
set gtf = fso.getfolder("c:\temp\etc")
fso.CopyFile "c:\temp\*.txt", gtf
    • good
    • 2

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFileSystemObject CopyFile の指定したファイル名にアスタリスクが付いていないと書き込みエラーが発生する

プログラム初心者です。宜しくお願いします。

職場で新PCを数十台導入したのでデータのお引越しをすることになりました。
主要なものはFASTWIZ.EXEを使用しますがNOTESデータの一部もデータ移管したいのです。
そこで以下のスクリプトを書いてみました。

------------------------------------

1 Dim objWshShell, objSF, FSO
2 Set objWshShell = CreateObject("WScript.Shell")
3 Set objSF = objWshShell.SpecialFolders
4 Set FSO = CreateObject("Scripting.FileSystemObject")
5 FSO.CopyFile "c:\notes\data\*.id", objSF.Item("MyDocuments")
6 FSO.CopyFile "c:\notes\data\desktop.dsk", objSF.Item("MyDocuments")
7 FSO.CopyFile "c:\winnt\notes.ini", objSF.Item("MyDocuments")

------------------------------------


ファイル名にアスタリスクを入れていないと書き込み出来ないとエラー(800A0046)が発生してしまいます。調べてみましたら権限が無いと発生するエラーだったのですが

例えば

7 FSO.CopyFile "c:\winnt\notes*.ini", objSF.Item("MyDocuments")

のようにファイル名の一部にアスタリスクを追加するとエラーが発生せず正常に実行されます。


アスタリスクを付ければ正常に動作するので良いんですが、何故なのか分からないと気持ちが悪くていけません。
調べてみたのですが分からず皆様のお知恵を拝借出来ないかと書き込ませて頂きました。

宜しくお願い致します。

プログラム初心者です。宜しくお願いします。

職場で新PCを数十台導入したのでデータのお引越しをすることになりました。
主要なものはFASTWIZ.EXEを使用しますがNOTESデータの一部もデータ移管したいのです。
そこで以下のスクリプトを書いてみました。

------------------------------------

1 Dim objWshShell, objSF, FSO
2 Set objWshShell = CreateObject("WScript.Shell")
3 Set objSF = objWshShell.SpecialFolders
4 Set FSO = CreateObject("Scripting.FileSystemObject")
5 FSO.CopyFil...続きを読む

Aベストアンサー

CopyFile メソッドは、
コピー元に*が指定された場合コピー先をフォルダとして扱います。
また、コピー先フォルダが¥で終わっているときフォルダとしてあつかいます。
逆に言うと、*が指定されていない場合で、コピー先フォルダ名として¥で終わっていない場合、ファイルからファイルとしてコピーをするということです。
つまり、ファイル名が指定されたとしてコピーしようとするが、実際にはフォルダ名であるので、エラーになっているというようなことかと思います。

Qフォルダ内のファイルを取得し別ディレクトリへコピーしたい

Windowであるフォルダ内の全てのファイルを取得して、別のディレクトリのフォルダへコピーしたいです。

バッチコマンドでできれば一番いいのですが、そんな機能をもっているコマンドはないみたいなので、VBスクリプトでも構いません。

いい方法ないでしょうか?

Aベストアンサー

'PDFファイルがあるフォルダ名
strBasePath = "C:\Box"
'コピー先のフォルダ名(このサブフォルダに6桁のフォルダ名が自動作成される)
strCopyPath = "C:\Box"
Call CustomCopyFile(strBasePath,strCopyPath)

'処理ルーチン
Sub CustomCopyFile(BasePath,CopyPath)
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(BasePath)
'ファイル名の検索
For Each objFile In objFolder.Files
strFolder = Left(objFile.Name,6)
strCreate = CopyPath & "\" & strFolder
strFname = objFolder.Path & "\" & objFile.Name
'フォルダ自動作成
If Not objFS.FolderExists(strCreate) Then
objFS.CreateFolder(strCreate)
End If
'コピー処理
objFS.CopyFile strFname, strCreate & "\"
Next
End Sub

'PDFファイルがあるフォルダ名
strBasePath = "C:\Box"
'コピー先のフォルダ名(このサブフォルダに6桁のフォルダ名が自動作成される)
strCopyPath = "C:\Box"
Call CustomCopyFile(strBasePath,strCopyPath)

'処理ルーチン
Sub CustomCopyFile(BasePath,CopyPath)
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(BasePath)
'ファイル名の検索
For Each objFile In objFolder.Files
strFolder = Left(objFile.Name,6)
strCreate = CopyPath & "\" & strFo...続きを読む

QWSHでファイルとフォルダのコピーをしたい

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

Aベストアンサー

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

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

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

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

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

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

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QFSO.CopyFileでのエラー無視方法

コピー元フォルダにあるxlsファイルを全てコピー先のフォルダにコピーするVBAを作っています。
既にコピー先フォルダに同名のファイルがある場合は上書きせずスキップし、
コピー先フォルダに無いファイルだけコピーしたいのですが、

Sub test()
Dim FSO As Object
Dim md As String

Set FSO = CreateObject("Scripting.FileSystemObject")
Set md = Format (Date, "MMDD")

FSO.CopyFile "C:\コピー元\*.xls", "C:\コピー先\"& md ,False

Set FSO = Nothing
End Sub

FSO.CopyFileをFalseにするとコピー先に同名のファイルがある場合に
エラーで止まってしまいます。
このエラーを無視してコピーを続ける方法はありますでしょうか。

今回は確認ダイアログなど一切出さずに処理する方法が知りたいのですが、
今後の為に同名のファイルがあれば上書き確認ダイアログを出し、
処理を分岐させる方法もありましたらヒントだけでも教えて頂けると嬉しいです。

作成はExcel2010ですが、Excel2002でも動作するように作りたいです。
よろしくお願いいたします。

コピー元フォルダにあるxlsファイルを全てコピー先のフォルダにコピーするVBAを作っています。
既にコピー先フォルダに同名のファイルがある場合は上書きせずスキップし、
コピー先フォルダに無いファイルだけコピーしたいのですが、

Sub test()
Dim FSO As Object
Dim md As String

Set FSO = CreateObject("Scripting.FileSystemObject")
Set md = Format (Date, "MMDD")

FSO.CopyFile "C:\コピー元\*.xls", "C:\コピー先\"& md ,False

Set FSO = Nothing
End Sub

FSO.CopyFileをFalseにするとコピー先に同...続きを読む

Aベストアンサー

#1です。ループを回していないのですね、失礼しました。
On error resume nextで通用するのは、ファイル毎にループ処理してコピーしているケースです。
ファイル毎にループを回し、既存かどうかの問い合わせをして処理する一例です。
ご参考まで。

Sub test()
Dim FSO As Object, targetFolder As Object, targetFile As Object
Dim folderName As String, destFilePath As String, answer As String

folderName = "C:\コピー元\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set targetFolder = FSO.getfolder(folderName)
For Each targetFile In targetFolder.Files
'拡張子判別のところは必要によりアレンジして下さい
If UCase(FSO.GetExtensionName(targetFile)) = "XLS" Then
destFilePath = "C:\コピー先\" & Format(Date, "MMDD") & "\" & targetFile.Name
If FSO.FileExists(destFilePath) Then
'既存なら問い合わせせずにパスする場合は、Thenの時の処理をコメントアウトして下さい。
answer = MsgBox(targetFile.Name & " がCopy先に存在します。上書きしますか?", vbYesNo)
If answer = vbYes Then FSO.CopyFile targetFile, destFilePath, True
Else
FSO.CopyFile targetFile, destFilePath, False
End If
End If
Next targetFile
Set FSO = Nothing
End Sub

#1です。ループを回していないのですね、失礼しました。
On error resume nextで通用するのは、ファイル毎にループ処理してコピーしているケースです。
ファイル毎にループを回し、既存かどうかの問い合わせをして処理する一例です。
ご参考まで。

Sub test()
Dim FSO As Object, targetFolder As Object, targetFile As Object
Dim folderName As String, destFilePath As String, answer As String

folderName = "C:\コピー元\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set targetFolder = FSO...続きを読む

QVBAにおいて、ファイルの移動にMoveFileを使っていますが、

VBAにおいて、ファイルの移動にMoveFileを使っていますが、
移動先に移動元と同じ名前が存在する時、エラーが発生してしま
います。これを回避して、移動することはできないのでしょうか。
(移動先に移動元と同じ名前が存在しても、上書きで移動。)
また、MoveFile以外の方法はないのでしょうか。
教えて下さい。

Aベストアンサー

こんにちは
#1のHirorin_20さんと同意見です。

方法1:
dir関数で、同名Fileのチェック
あれば削除

方法2:
On Error Resume Next
Kill パス&ファイル名
On Error GoTo 0

ただし、どちらの場合でも、対象のファイルが開いているなど、Windowsがロックしている場合には対応できません。

Q[VBScript]ファイルの削除

ファイルの削除を行うために以下のように書いて実行したところ。

「Microsoft VBScript 実行時エラー '800a0046'
- 書き込みできません。」
というエラーメッセージがでてしまいました。

-------------------------------
Set fso = CreateObject("Scripting.FileSystemObject")
Set src = fso.GetFile(FileName.txt)
src.Delete
-------------------------------

ファイルのプロパティを見てもフルコントロールを許可していますし、実行者もAdmin権限です。
どこをチェックすればよろしいでしょうか?
または、どのようにコーディングすればよいでしょうか?

Aベストアンサー

指定のファイルを他のアプリで開いてませんか?
若しくは、他のアプリで開いて、そのアプリが落ちたり
してませんか?(Excelの場合、掴みっぱなしになる)

QFilecopyステートメントでエラー

今VB6SP5を用いてRAS接続で
サーバーへファイルをコピーするプログラムを
作っています
ファイルのコピー方法はFilecopyステートメントを使用
この時ファイルコピーでエラーになる事があるのですが
原因は何が考えられますか
サーバはWindows 2000 SP4
クライアントも同様 Windows2000 SP4

以上です

Aベストアンサー

>偶数回目は成功するのでファイル共有なのではと思っています
たしかに偶数回目で成功するのであれば、そうかもしれないと思ったのですが、、、
以下の実験をしたところ、不安はまだ消えず。。。


FileCopyの仕様
FileCopy source, destination

sourceに存在しないファイルを指定したとき
エラー番号:53/ファイルが見つかりません。

sourceに排他されているファイルを指定したとき
エラー番号:70/書き込みできません。

destinationが存在しない(参照できない)フォルダを指定したとき
(フォルダ(共有フォルダ)を参照できないとき:これはセッション問題も含みます。)
エラー番号:52/ファイル名または番号が不正です。

という結果を得ました・・・・

イメージ的にはsourceが不正なときに、53のエラーが出てほしかったんだけどなぁ・・・


そこでさらに実験願います。
・圧縮ファイルを作成したあと、、、
※その圧縮ファイルではなく、既存の別のファイルをネットワーク上のサーバにコピーできますか?
※その圧縮ファイルを、ローカルのマシンのどこかのフォルダにコピーできますか?
この2点で、source側かdestination側のどちらに問題があるかがわかると思います。

>偶数回目は成功するのでファイル共有なのではと思っています
たしかに偶数回目で成功するのであれば、そうかもしれないと思ったのですが、、、
以下の実験をしたところ、不安はまだ消えず。。。


FileCopyの仕様
FileCopy source, destination

sourceに存在しないファイルを指定したとき
エラー番号:53/ファイルが見つかりません。

sourceに排他されているファイルを指定したとき
エラー番号:70/書き込みできません。

destinationが存在しない(参照できない)フォルダを指定したとき
(フォル...続きを読む

Q【VBScript】変数のスコープ

変数のスコープについて詳しく教えて下さい。

どこで宣言すれば、どこまで有効か知りたい。

条件分岐やループ、ファンクション等でのスコープが分かりません。

特に、ファンクションの中のファンクションとかです。

参考サイトやヒントだけでも良いので教えて下さい。

Aベストアンサー

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか?
そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。
もしも検証できない状況にあるのでしたら、ごめんなさい。

かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

■結論
・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可
・プロシージャ内(←ネストレベルは関係ない)で宣言された変数は当該プロシージャ内のみで有効
・プロシージャのネスト時に参照可能な変数は、グローバル変数と自プロシージャ内で宣言された変数のみ(=自分を呼び出した親プロシージャ内の変数を参照することはできない)
・プロシージャの引数がグローバル変数と同名の場合、引数が優先される
・条件分岐やループの内側か外側かは関係ない(内側で宣言した変数を外側で参照できる)
#プロシージャ≒「ファンクション」です。

■参考URL
http://www.google.com/search?q=vbscript+%E5%A4%89%E6%95%B0+%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97
http://www.keynus.co.jp/~uhara/html/vbscript/16.htm

これで答えになっているでしょうか??

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか?
そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。
もしも検証できない状況にあるのでしたら、ごめんなさい。

かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

■結論
・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可
・プロシージャ内(←ネストレベルは関係ない)...続きを読む

QVBScript フォルダ以下からファイルの検索、コピー

VBScriptはまったくの初心者ですので、自分なりに調べてはみたのです
がどうしてもわからなかったため質問しています。
OSはWinXPになります。
VBScriptで特定のフォルダ(C:\AAA\)以下からファイル(*.txt)を検索し
てコピーするプログラムを書きたいです。

C:\AAA\・・・\*.txt

指定したフォルダからファイルを検索をすることはできたのですが、サ
ブフォルダがたくさんある場合のファイル検索ができませんでした。

コピーの仕方は検索したファイルから最新のタイムスタンプのファイル以外を別フォルダにコピーしたいです。

あとわかりやすいVBScriptについて記載されているサイトも教えていただけると助かります。

Aベストアンサー

フォルダ以下からファイルの検索をするにはサブフォルダについて再帰処理をする方法があります。例えば下のコードのように。

コピーは考慮すべきことが多いと思います。最新のタイムスタンプを知るにはファイル名ごとに(?)記憶する必要があります。また別フォルダは一つのフォルダにするか、コピー元と同じ構造にするか、ファイル名が重複したらどうするか、容量不足になったらどうするか、など。

VBScriptでgoogleすればたくさんサイトが出てきますね。MSのページは基本です。

http://www.microsoft.com/japan/msdn/scripting/
http://www.microsoft.com/japan/technet/scriptcenter/default.mspx

-----
Set FSO = CreateObject("Scripting.FileSystemObject")
ShowSubfolders FSO.GetFolder("C:\AAA")
Sub ShowSubFolders(Folder)
For Each File in Folder.Files 'Foler内のファイルを列挙する
Fname = File.name
If LCase(FSO.GetExtensionName(Fname))="txt" Then '拡張子txtを判定
WScript.Echo Folder & "\" & Fname
End If
Next
For Each Subfolder in Folder.SubFolders 'Foler内のフォルダを列挙する
ShowSubFolders Subfolder '再帰呼び出し
Next
End Sub
-----

フォルダ以下からファイルの検索をするにはサブフォルダについて再帰処理をする方法があります。例えば下のコードのように。

コピーは考慮すべきことが多いと思います。最新のタイムスタンプを知るにはファイル名ごとに(?)記憶する必要があります。また別フォルダは一つのフォルダにするか、コピー元と同じ構造にするか、ファイル名が重複したらどうするか、容量不足になったらどうするか、など。

VBScriptでgoogleすればたくさんサイトが出てきますね。MSのページは基本です。

http://www.microsoft....続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング