[ 新規に投稿する ]

USBメモリのドライブレターNo.08612
伯林 さん 17/12/29 09:55 [ コメントを投稿する ]
是非お知恵をお貸し下さい。
マクロの中でmnop.txtファイル(名は固定ではありません)を開くのに
openfile "e:\\abcd\\efgh\\ijkl\\mnop.txt"; 
のように書いています。このe:がUSBメモリなので差すたびにドライブレターが変わり
エラーとなり、苦慮しています。
USBドライブにはEASYDESK_Nと名付けてあり、エキスプローラでは例えば
EASYDESK_N(I:)
のように表示されます。
ドライブレターが変化してもmnop.txtを開くいい方法はないでしょうか?
[ ]
RE:08612 USBメモリのドライブレターNo.08613
でるもんたいいじま さん 17/12/29 10:18 [ コメントを投稿する ]
  こんにちは。でるもんた・いいじま@秀丸愛用者です。

> マクロの中でmnop.txtファイル(名は固定ではありません)を開くのに
> openfile "e:\\abcd\\efgh\\ijkl\\mnop.txt"; 
> のように書いています。このe:がUSBメモリなので差すたびに
> ドライブレターが変わりエラーとなり、苦慮しています。

簡単な方策として…
フォルダ構成はある程度まで固定でしょうか?

もし \abcd\efgh というフォルダがそのUSBメモリに存在することが
確実なのであれば、existfile("d:\\abcd\\efgh") のようにして、
特定のドライブレターが当該USBメモリに割り当てられているかどうかを
判定することができます。

この場合、一般的にはforでループを回してd〜zドライブについてチェック
すれば十分だと思います。唯一の難点は、外付けフロッピードライブが
d以降の(かつ、当該USBメモリより若い)ドライブに存在する場合には
そのドライブが駆動してしまうという点ですが、外付けFDDは通常a・b
ドライブに割り当てられますので、実用上は問題ないと思います。

あと、COMでScripting.FileSystemObjectを呼び出すという方法もあります。
VBSで書かれたサンプルコードがたとえばこちら↓
http://www.whitire.com/vbs/tips0075.html
にありますので、マクロヘルプを読みながら秀丸マクロでCOM呼び出しを
記述すれば目的は達せられると思います。フロッピードライブが動いて
しまうという難点はこちらでもどうしようもないですね。
[ ]
RE:08613 USBメモリのドライブレターNo.08614
Iranoan さん 17/12/29 13:37 [ コメントを投稿する ]
  伯林さん今日は、Iranoan です
> > マクロの中でmnop.txtファイル(名は固定ではありません)を開くのに
> > openfile "e:\\abcd\\efgh\\ijkl\\mnop.txt";
> > のように書いています。このe:がUSBメモリなので差すたびに
> > ドライブレターが変わりエラーとなり、苦慮しています。
<snip>
> この場合、一般的にはforでループを回してd〜zドライブについてチェック
> すれば十分だと思います。唯一の難点は、外付けフロッピードライブが
他には、個人で使用する場合に限られますが、USB を含む外付けのドライブ名を固定してしまう方法が有ります
ググったらこんなページがりました
外付けドライブ名を固定する方法(Windows10) https://bacque.biz/archives/5617
外付けドライブ名を固定する方法(Windows7) https://bacque.biz/archives/2781
留意点として履き受注に有る通り、他の機器を先に繋げた時に使われてしまう若い文字を使わないことです
[ ]
RE:08614 USBメモリのドライブレターNo.08615
秀丸担当 さん 17/12/29 14:49 [ コメントを投稿する ]
 
そこそこ用途がありそうなので、でるもんたいいじまさんご紹介のWebページを参考に、COMを使ったマクロにしてみました。
Label_GetNamedDrive:以下のサブルーチンをcallで呼んで使います。
"MYVOLUME"のところを"EASYDESK_N"にするといいと思います。


call Label_GetNamedDrive "MYVOLUME";
$strTargetDrive = $$return;

message $strTargetDrive;
//if( $strTargetDrive != "" ) {
//  openfile $strTargetDrive + ":\\abc.txt";
//} else {
//  //ドライブなし
//}

endmacro;

//------------
Label_GetNamedDrive:
  ##objFSO = createobject("Scripting.FileSystemObject");
  ##numDrive = 'C';
  $$strRet="";
  while( ##numDrive <= 'Z' ) {
    $$strDrive = char(##numDrive);
    if( member(##objFSO, "DriveExists", $$strDrive) != 0 ) {
      ##objDrive = member( ##objFSO, "GetDrive", $$strDrive );
      if( member(##objDrive, "IsReady" ) != 0 ) {
        $$strVolume = member( ##objDrive, "VolumeName" );
        //message $$strDrive + "のボリュームラベル:" + $$strVolume;
        if( $$strVolume == $$1 ) {
          $$strRet = $$strDrive;
        }
      }
      releaseobject ##objDrive;
      if( $$strRet != "" ) {
        break;
      }
    }
    ##numDrive = ##numDrive + 1;
  }
  releaseobject ##objFSO;
  return $$strRet;
[ ]
RE:08615 USBメモリのドライブレターNo.08616
伯林 さん 17/12/30 14:29 [ コメントを投稿する ]
でるもんた・いいじま さん
Iranoan さん
秀丸担当 さん

暮れのお忙しいのにレス頂き、感謝しております。
私、あまりVBSやパソコンに詳しくないので、でるもんた・いいじまさんやIranoan さんの文章を読み、さて、どうしようか?と悩んでおりましたら、秀丸担当さんからの、そのものズバリのコードを頂き早速検証してみました。
結果、すこぶる順調に動作いたしました。
私の作りかけのマクロの中で、同名ファイルの検索、書き込み等ドライブレターで悩んでいた部分が全て解決いたしました。
ありがとうございました。

皆様、よいお年をお迎えください。
[ ]

[ 新規に投稿する ]