ショートカットファイルのリンク先を置換するマクロの改良~パスの存在チェックをするバッチ~
2023年04月23日
会社で使っているNASのリンク切れが激しい。。。
間違ってリンク切れのショートカットファイルをクリックすると
1分後にエラーメッセージが出てうざい。
NASの統廃合があった関係で、ショートカットファイルが全滅してる。
そんなときのために以下の記事を書いたものの、使ってみたら全然だめじゃん!
「ショートカットファイルのリンク先を置換するマクロ」
間違ってリンク切れのショートカットファイルをクリックすると
1分後にエラーメッセージが出てうざい。
NASの統廃合があった関係で、ショートカットファイルが全滅してる。
そんなときのために以下の記事を書いたものの、使ってみたら全然だめじゃん!
「ショートカットファイルのリンク先を置換するマクロ」
置換する動きは問題ないんだけど、リンク切れを起こさないために
該当ファイルの存在チェックをしていて、
NASのIPアドレスが違うと1分くらい応答が返ってこなくなる。
まず試したのが、リンク切れのタイムアウトを短くする方法。
レジストリをいじると即タイムアウトにできるらしいが、
ユーザー権限ではできなそうなので断念。
次に考えたのがマクロの非同期処理。
エクセルの真髄で紹介されているけど、ソースがめっちゃ長くて理解できず断念。
https://excel-ubara.com/vba_class/VBA_CLASS_06.html
上記の記事でめっちゃいいヒントを発見。
「VBScriptを使用したマルチプロセスでは、結果の取得は別途出力したファイルを使うことになります。」
ファイルを使えばいいのか!!!
やりたいことは、リンク先のファイルやフォルダの有無をファイルに出力して、
全件出力完了したら、結果を読み込む。
まず考えたのが、dir /b で結果を取得する方法。
結果は以下の通り。
①該当するファイルかフォルダがあれば、パスが返される。
②リンク切れの場合にログ出力されない。
③フォルダ指定の場合だと、任意のファイル名が返される。
②はコマンドの結果がブランクだとどうやってもだめなもよう。
dir /bの結果を変数として格納して、IF文にするしかなさそう。
https://tech.kurojica.com/archives/1338/
を参考に以下の行を追加。%1は対象のパス。
for /f "usebackq" %%t in (`dir /b %1`) do set dir_rslt=%%t
③は、ファイルかフォルダか事前に調べる必要がありそう。
検索したら以下の「\を付けてexistで判定」が一番スマート。
http://piyopiyocs.blog115.fc2.com/blog-entry-881.html
あとは、VBAからコマンドを実行して、全部ログに吐かれるのを待ってから
出力結果を辞書配列に入れて比較すれば良さそう。
ログ出力の行数が不足すると無限ループになるから、
そこはブレイクポイントを用意した方がいいかな。
以下、ソース。ソースコードファイルは こちら。
@echo off
rem ファイルの存在チェックを行い、結果をresult.logに書き込む
for /f "usebackq" %%t in (`dir /b %1`) do set dir_rslt=%%t
if "%dir_rslt%"=="" (
@echo 該当ファイルはありません。 >> result.log
) else if exist "%1\" (
@echo %1 >> result.log
) else (
@echo %1 >> result.log
)
::start "" result.log
今回は役に立たなかったけど調べたこと(備忘録)
●echoで改行しない
https://tooljp.com/bat_qa/Display-without-a-line-break-with-echo-709E.html
@echo|set /p="test 1"
PR
Comment