1.スクリプト処理構成
2.スクリプト実行方法
3.想定ファイル
4.スクリプト詳細
5.完成コード
スクリプトの主な流れとしては下記の通りです。
1.指定フォルダのファイルを読み込む
2.ファイル名を判定し、指定のフォルダにコピー
3.コピー元のファイルを削除
4.2~3をすべてのファイルについて行う
スクリプトファイルを実行
今回指定したのは、デスクトップのtestフォルダ内のファイルです。
すべてのファイルが、R_
もしくはL_
ではじまるファイル名です。
1)特殊フォルダを指定します
WScript.ShellオブジェクトのSpecialFoldersに引数で特殊フォルダを指定します。
1 |
<WScript.Shellオブジェクト名>.SpecialFolders(<引数>) |
今回はデスクトップのtestフォルダを指定したので、↓のとおりになります。
1 2 3 4 |
'WScript.Shellのオブジェクトを作成し、変数oWSに格納します。 Set oWS = CreateObject("WScript.Shell") 'ターゲットフォルダを指定します。今回はデスクトップのtestフォルダを指定。 strTrgFolderPath = "" + oWS.SpecialFolders(4) + "\" +"test" + "" |
特殊フォルダに引数に指定できるものは、実際にやったことあるものだけ上げると下記表の通りです。
特殊フォルダ | 引数 |
パブリックデスクトップ | 0 |
パブリックスタートメニュー | 1 |
デスクトップ | 4 |
スタートメニュー | 11 |
ドキュメント | 16 |
ちょっと脱線
↑のコードで"" +
でフォルダパスの前後を挟んでいたことにお気づきでしょうか。
これは、スクリプトの終端を明示するためにつかっています。
デスクトップですから、当然
C:Users\<UserName>\Desktop
というパスになるわけですが、
<UserName>にスペースが入っていると、コンストラクタが終端を見失うため、エラーになってしまいます。
興味があれば、試しに↓のコードに置き換えて実行してみてください。
1 |
strTrgFolderPath = oWS.SpecialFolders(4) + "\" +"te st" |
スペースが入って、終端を見失う可能性がある場所には、""
で囲むと少し安心してコーディングできると思います。
さて、話を戻して
2)ターゲットフォルダ内のファイルを取得します
ファイルシステムオブジェクトを作成して、GetFolderでフォルダを取得し、Filesプロパティでターゲットフォルダ内のすべてのファイルを取得して、変数に格納します。
書式は↓のような感じです。
1 |
<ファイルシステムオブジェクト名>.GetFolder(<フォルダパス>).<プロパティ名> |
実際に使ったコードがこちら。
1 2 |
Set fs = CreateObject("Scripting.FileSystemObject") Set ofls = fs.GetFolder(strTrgFolderPath).Files |
3)分別先のフォルダを作成
1 2 3 |
' if not←否定 'フォルダがなかったらフォルダを作成するif文です。 if not <ファイルシステムオブジェクト名>.FolderExists(<フォルダパス>) then <ファイルシステムオブジェクト名>.CreateFolder(<フォルダパス>) |
1 2 |
if not fs.FolderExists(strTrgFolderPath +"\Left") then fs.CreateFolder(strTrgFolderPath +"\Left") if not fs.FolderExists(strTrgFolderPath +"\Right") then fs.CreateFolder(strTrgFolderPath +"\Right") |
4)ファイル名を判定して、フォルダ分けする
さて、今回のスクリプトの本丸。ファイル名を判別して、フォルダ分けするコードです。
2)で取得した、フォルダ内のファイルをFor Each文で1ファイルずつ取り出して判定していきます。
今回の判定基準はファイル名にR_
もしくはL_
があるかです。ファイル名に含んでいればいいので、(緩い。。。)
1 |
instr(<検索対象文字列>,<検索文字>) > 0 |
instrという関数を使います。検索文字があれば、1文字目に見つかれば、1を返します。ない場合は、0を返します。
今回は含んでいるだけでいいので、>0
で指定しました。
参考までに、ファイル名の先頭にあるかを判定する場合は、↓のような感じで、1番目にあるかを判定すればいいです。
1 |
if instr(fs.GetFileName(file),"R_") = 1 then |
今回実際に実装したコードは↓の通り。
For Each でoflsからファイルパスを1つ出して、
R_を含んでいるか判定して、合致しなければ
L_を含んでいるか判定します。今回サンプルに用意したファイルは、R_もL_も両方含んでいるファイルはありませんが、両方含んでいる場合、このままではR_が入るフォルダに格納されてしまうので、注意です。
1 2 3 4 5 6 7 8 9 |
For Each file in ofls dmsg file if instr(fs.GetFileName(file),"R_") > 0 then dmsg "r" fs.MoveFile file ,strTrgFolderPath + "\" +"Right" + "\" elseif instr(fs.GetFileName(file),"L_") > 0 then dmsg "l" : fs.MoveFile file ,strTrgFolderPath + "\" +"Left" + "\" end if Next |
今回は実装しませんでしたが、↓のような条件分岐で行ってもいいと思います。というか、こっちのほうがスマート。。。
1 2 3 4 5 6 7 8 9 |
if instr(<>,"R_") > 0 and instr(<>,"L_") > 0 then 'R_を含みかつL_を含むものに行う処理を記述 elseif instr(<>,"R_") > 0 'R_を含み かつ L_を含まないものに行う処理を記述 elseif instr(<>,"L_") > 0 'R_を含まない かつ L_を含むものに行う処理を記述 else 'R_もL_も含まないものに行う処理 end if |
いろいろ脱線しましたが、今回の処理はこのような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
sub dmsg(txt) 'exit sub msgbox txt end sub Set oWS = CreateObject("WScript.Shell") strTrgFolderPath = "" + oWS.SpecialFolders(4) + "\" +"test" + "" Set fs = CreateObject("Scripting.FileSystemObject") Set ofls = fs.GetFolder(strTrgFolderPath).Files if ofls.count > 0 then if not fs.FolderExists(strTrgFolderPath +"\Left") then fs.CreateFolder(strTrgFolderPath +"\Left") if not fs.FolderExists(strTrgFolderPath +"\Right") then fs.CreateFolder(strTrgFolderPath +"\Right") For Each file in ofls dmsg file if instr(fs.GetFileName(file),"R_") > 0 then dmsg "r" : fs.MoveFile file ,strTrgFolderPath + "\" +"Right" + "\" if instr(fs.GetFileName(file),"L_") > 0 then dmsg "l" : fs.MoveFile file ,strTrgFolderPath + "\" +"Left" + "\" Next end if dmsg ofls.count |
本日もPROGFRONTIREをご覧いただきありがとうございました。
明日が、あなたにとってなりたい自分に近づける日でありますように。