人気マンガがだれでも無料♪電子コミック読み放題!!

VBScriptで指定フォルダにあるファイルに対して処理を行っています。
その指定フォルダにファイルがコピー中であったり、
他のプロセスがファイルを作成中だったりする場合、
このスクリプトを実行すると、コピー中や作成中のファイルに対して処理を行ってしまうため、
正しく処理ができません。
コピー中だったり、他のプロセスが作成や編集を行っている場合、
そのファイルに対しては処理を行わず、次回実行時に編集中でなければ
処理を行うようにしたいと思います。
コピー中だったり、他のプロセスが作成や編集を行っているかどうかを
VBScriptで識別する方法を探したのですが、分からなかったため、教えてください。

なお、ファイルは数GBのものが多く、他プロセスが作成を行っている場合、
30~3時間程度行っています。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

単にエラー対応処理を書いたらいいだけでは?



dim ErrorCodeSave

on error resume next
open ・・・
ErrorCodeSave = Err.Number
On Error Goto 0
if ErrorCodeSave > 0 then
if ErrorCodeSave = xx(具体的な数値は実行してみて確認してください) then
msgbox("処理中。時間を置いてから再実行してください")
else
Err.Raise ErrorCodeSave
end if
end if

みたいな感じで。

参考:
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh0 …

この回答への補足

他プロセスが書き込み中でもファイルはオープンできてしまうので、
エラーにならないのです・・・。

補足日時:2011/10/16 14:03
    • good
    • 0

こちらも古典的な方法ですが排他で開いてエラーにならなかったら未使用


と判断する・・AccessのVBA中で拝借していたものです
http://oshiete.goo.ne.jp/qa/2543381.html
でも、こういったのは微妙なタイミングで使い出したりしちゃってくれるので
難しいですね。
    • good
    • 0

昔からの手法では、


別のファイルを用意し、
長時間処理するプログラムに、処理が終わったら
処理が終了したことを書き込んでもらって、
そちらを確認して次の処理を実行することで対応
します。

この回答への補足

ご回答ありがとうございます!
回答つかないかと思ってたので、うれしいです!

>長時間処理するプログラムに、処理が終わったら
>処理が終了したことを書き込んでもらって、

ファイルをコピーしたり、作成したりする他プロセスは自作ではないので、
「処理が終わったら書き込んでもらう」という処理を追加することができません。

ファイルのSizeやDateLastAccessedプロパティなどで確認してみましたが、
Sizeはコピー開始時にコピー元のサイズになってしまっていますし、
DateLastAccessedはコピー開始後はコピー終了するまで更新されないみたいです。

他に何か案はないものでしょうか。

補足日時:2011/06/21 16:25
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

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

Qファイルやフォルダの有無、他のユーザーの使用状況を調べたい

 ExcelVBAの書き方で質問があります。
ファイル名やフォルダ名を指定して…
(1)フォルダにファイルが存在するかどうかを調べる方法
(2)フォルダが存在するかどうかを調べる方法
(3)ファイルが他のユーザーの使用中になっているかを調べる方法

 現在は(1)については、Workbooks.Open Filename:=~でファイルが無ければ、On Error GoToで分岐させるといった方法を行っているのですが、もっとダイレクトに有無を調べる方法が知りたいのです。
 (2)や(3)については、どうすればよいのやら?
 初心者ですので、簡単な表現でお願いします。
 よろしくご教授下さい。

Aベストアンサー

Sub Test()
  'ディレクトリ存在チェック
  MsgBox IsDir("C:\")
  '排他状態
  MsgBox IsNoOpen("C:\test.xls")
End Sub

'ディレクトリ存在チェック
'TRUE=存在している
Public Function IsDir(ByVal inDirName As String) As Boolean
  Dim fsoObj As Object
  Dim fsoDir As Object
  
  On Error Resume Next
  Set fsoObj = CreateObject("Scripting.FileSystemObject")
  Set fsoDir = fsoObj.GetFolder(inDirName)
  IsDir = Not (fsoDir Is Nothing)
  
  Set fsoDir = Nothing
  Set fsoObj = Nothing
End Function

'誰かがファイルを開いていないかをチェックする
'TRUE=編集可能状態で開くことができる
Public Function IsNoOpen(ByVal inXlsFileName As String) As Boolean
  'ファイルが存在していないのは問題外でアウト
  If Dir(inXlsFileName) = "" Then
    Exit Function
  End If
  
  On Error Resume Next
  '書き込み専用でオープンでエラーが発生しなければ、誰も開いていないとみなす
  Open inXlsFileName For Binary Lock Read Write As #1
  Close #1
  IsNoOpen = (Err.Number = 0&)
End Function

Sub Test()
  'ディレクトリ存在チェック
  MsgBox IsDir("C:\")
  '排他状態
  MsgBox IsNoOpen("C:\test.xls")
End Sub

'ディレクトリ存在チェック
'TRUE=存在している
Public Function IsDir(ByVal inDirName As String) As Boolean
  Dim fsoObj As Object
  Dim fsoDir As Object
  
  On Error Resume Next
  Set fsoObj = CreateObject("Scripting.FileSystemObject")
  Set fsoDir = fsoObj.GetFolder(inDirName)
  IsDir = Not (fsoDir Is Nothing)
  
 ...続きを読む

QDOSコマンドのコピー完了判定

サーバから各クライアントの共有フォルダにファイルをXCOPYでコピーしたのち、正しくコピーがされたかという確認のDOSコマンドはどのように記述すればよろしいのでしょうか?
もう一点、コピー開始の前にログファイルを出力設定して、コピー完了時に出力するコマンドも教えていただきたいのですが。

Aベストアンサー

> 正しくコピーがされたかという確認のDOSコマンドは
> どのように記述すればよろしいのでしょうか?
一般的にDOSコマンドは終了時に1バイトの値をDOSに返す。これはERRORLEVELという環境変数でアクセスする事ができる。なので、バッチファイルにこう書いて、成功時・失敗時にxcopyからどんな値が返ってきているか確かめてみると良いよ。

xcopy ほにゃほにゃ
echo %ERRORLEVEL%


> コピー開始の前にログファイルを出力設定して、
> コピー完了時に出力するコマンドも教えていただきたいのですが。
コピーされてる間に出力されるものをファイルに落としたいのかな? なら、

C:\>xcopy ほにゃほにゃ > xcopy.log

とすると、ファイルに画面出力の内容が入る。command.comではなくNT系のcmd.exeなら、「2>&1 > xcopy.log」とする事で、標準エラー出力まで奪う事ができる。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qエクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む

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....続きを読む

Qvbsでテキストファイル内の文字列検索

初心者です。

テキストファイルを指定し、含まれる文字列を検索し、
結果表示したいと考えております。

色々探して、以下で作成したのですが、
うまく動いてくれません。

出来ましたら、テキストファイルの中の文字列の
一部分を指定して動作させたいと思っております。

どなたかご教示のほど宜しくお願い致します。


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

Set WSHFso = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strSearchWord

Set tmpFile = WSHFso.OpenTextFile("C:\AAA.txt")

Do Until tmpFile.AtEndOfStream
tmpLine = tmpFile.ReadLine
strSearchWord = strSearchWord & tmpLine & vbcrlf
Loop


Dim SearchWord
SearchWord = split(strSearchWord," ")


if InStr(SearchWord(ix), "test")<>0 then
WScript.Echo " testを含みます。"
else
WScript.Echo " testを含みません。"

end if


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

初心者です。

テキストファイルを指定し、含まれる文字列を検索し、
結果表示したいと考えております。

色々探して、以下で作成したのですが、
うまく動いてくれません。

出来ましたら、テキストファイルの中の文字列の
一部分を指定して動作させたいと思っております。

どなたかご教示のほど宜しくお願い致します。


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

Set WSHFso = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell...続きを読む

Aベストアンサー

こんにちは。

コードの細かい部分の目的としている部分は良く分からないけれども、少し直してみました。あくまでも、VBSです。元のコードは、ちょっと違うようです。

'-------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
'Set WshShell = CreateObject("WScript.Shell") '??
Dim strSearchWord
dim i
'-------------------------------------------
Public Const FileName ="C:\AAA.txt"
Public Const sWord =""test"
'-------------------------------------------
Set tmpFile = WSHFso.OpenTextFile(FileName)

Do Until tmpFile.AtEndOfStream
tmpLine = tmpFile.ReadLine
i = i + 1
nflg= fSearchWord (tmpLine)
If nflg Then Exit Do
Loop
If nflg Then
MsgBox i & "行目に" & sWord &"を含みます。",64
Else
MsgBox sWord &"を含みませんでした。",48
End If
'-------------------------------------------
Function fSearchWord(tmpLine)
Dim flg
SearchWord = Split(tmpLine," ")
For ix = LBound(SearchWord) To UBound(SearchWord)
If Len(Trim(SearchWord(ix))) > 0 Then
If InStr(1, SearchWord(ix), sWord, 1) > 0 Then
flg = True
Exit For
End If
End If
Next
fSearchWord = flg
End Function
'-------------------------------------------

こんにちは。

コードの細かい部分の目的としている部分は良く分からないけれども、少し直してみました。あくまでも、VBSです。元のコードは、ちょっと違うようです。

'-------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
'Set WshShell = CreateObject("WScript.Shell") '??
Dim strSearchWord
dim i
'-------------------------------------------
Public Const FileName ="C:\AAA.txt"
Public Const sWord =""test"
'---------------------...続きを読む

Qvbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはど

vbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはどうすればいいでしょうか。
無言でコピーするコードはいろいろと紹介されているのですが、何も表示されないので進行状況がわかるようにしたいのです。
残り時間表示やパーセント表示などどのような表示方法でもいいのでおおよその進行状況がわかる方法をご存知でしたら教えて頂けないでしょうか。
宜しくお願い致します。
<例>
コピー元ファイル:"C:\test\*.*"
コピー先フォルダ:"C:\backup\"

Aベストアンサー

●ファイルのコピー中に視覚的なインジケータを表示する方法はありますか
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/oct06/hey1010.mspx
にそのままの例が載っております。

Const FOF_CREATEPROGRESSDLG = &H0&
strTargetFolder = "C:\backup\"
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(strTargetFolder)
objFolder.CopyHere "C:\test\*.*", FOF_CREATEPROGRESSDLG

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には明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

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


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

人気Q&Aランキング