忍者ブログ

ショートカットファイルのリンク先を置換するマクロの改良~パスの存在チェックをするバッチ~

2023年04月23日
会社で使っている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
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字