« 2017年5月 | トップページ | 2017年8月 »

2017年7月の記事

2017年7月17日 (月)

エクスプローラでファイル名をクリップボードにコピーする

Windowsのエクスプローラを使っていて「何でこんなこともできないんだ 」と叫びたいことが何度もあるが、その最たるものが、ファイル名のクリップボードへのコピーである。
フリーソフトを使えば何とかなるのであるが、会社のPCにはインストールできない。

コマンドプロンプトを開いて dir を叩くという手もあるがやはり面倒くさい ・・・
などなど思いながら、いろいろググってみると、ファイルなどを選択した状態で右クリックでメニューが表示されるが、Shiftを押しながら右クリックすると、現れるメニュー項目が増え、その中の「パスのコピー」を使えばフルパスの情報がクリップボードにコピーされることが判った。

以下は1フォルダと1ファイルを選択して実行した例である。

 "E:\test_folder\folder1"
 "E:\test_folder\file01.txt"

確かにこれでも悪くないのだが、自分の好み的には以下の点が不満であった。

  • パス名(上の例では E:\test_folder\folder1 )は最初に1行あればよく、あとはファイル名やフォルダ名だけの一覧の方が良い
  • 両端のダブルコーテーションはいらない

しばらくはこれで乗り切っていたのだが、やはり何とかならないかと再度ググってみたところ以下の記事を発見。

 Palm84 某所の日記 - 「送る」でファイル名をごにょごにょするバッチファイル

エクスプローラの右クリックメニューの「送る」と自作のバッチファイルを組み合わせて、フルパスやファイル名などの一覧をテキストファイルに出力する例が4種類公開されている。
仕様的に私の欲しいものとは違っているのでこのまま使わせてもらおうとは思わなかったが、『「送る」とバッチファイルの組合せで欲しいものができるのでは?』というのは大きな発見であった。

ということで、これを参考にバッチファイルの自作にチャレンジしてみた。
以前の記事「REGZAが来た ~写真と動画再生編~」でも10行程度のWindowsバッチファイルの自作にチャレンジし、その文法の謎仕様で苦戦したことを書いたが、今回もメチャクチャに苦戦し、結局都合1日(8時間)以上費やした気がする。

それでも何とか試行錯誤しながら 3種類のバッチを完成した。
 

■共通仕様や言い訳など

  1. エクスプローラ上で対象とするフォルダやファイルを選択し(複数選択可)、右クリックメニューで「送る」⇒サブメニューを選択することで実行する。
  2. 結果はクリップボードにコピーされる。
  3. 実行中はコマンドウィンドウが表示される。
  4. 内部的には 環境変数 %TEMP%フォルダに一時ファイルを作成している。(実行終了時に削除)
  5. バッチ内にはコメントは入れていないが、高々数十行なのでご容赦いただきたい。
  6. ループ処理に for文を使ったり goto文を使ったり、フォルダか否かの判断に 属性を見たり exist文を使ったり、などなど、識者から見ると謎の記述になっていると思うが、私にも謎である 。 会社でのドメイン/ファイルサーバ利用の環境下でも動作するように修正していった結果、結局この記述になってしまった ・・・

3については、表示されない方が好みの方もいると思うが、

  • 表示しないようにするのは難しい(webの情報を見てチャレンジしたがやはり一瞬表示される)
  • サブフォルダ以下も階層的にファイル情報をコピーする機能では時間がかかる場合があり、処理終了タイミングを把握するためにウィンドウ表示があった方が良い

という理由から今の仕様とした。

 

各バッチの仕様と実行例は以下の通りである。

■実行例に使ったフォルダ構成

興味半分でジャンクションやシンボリックリンクも張っているが(参考:ジャンクションを使ってみる(その1))、興味のない方は無視してもらって構わない。
ファイルサイズは、ファイル名の下1桁が1のものは 200バイト、2のものは 500バイトである。
 
【フォルダ構成】
Copy_files_001

エクスプローラとdirコマンドでは以下のように表示される。
 ※ショートカットのサイズは何故か 1131バイト、ファイルのシンボリックリンクのサイズは空白

 Copy_files_004 Copy_files_005

 
■3つのバッチの仕様と実行例

 
1.フォルダ名とファイル名をコピー

1行目にパス名、2行目以降に選択したファイルやフォルダの名前の一覧をコピーする。(フォルダ以下は見ない)
 
【実行例】 
test_folder直下の全フォルダとファイルを選択した場合、以下がクリップボードにコピーされる。

 E:\test_folder\
 folder2
 folder2_SL
 file01.txt
 file02.txt
 file11_HL.txt
 file12_SL.txt
 file21.txt - ショートカット.lnk
 folder1
 folder1_JC
 
 
2.Excel用ファイル情報をコピー

Excelにそのまま貼り付けできるよう、パス、ファイル名、サイズ、更新日時をタブ区切りでコピーする。コピー対象ファイルは、以下のとおりである。

  • 選択されている対象がフォルダ1つの時は、そのフォルダ以下の全ファイル(サブフォルダ以下も全て表示、フォルダ自体の行はなし)
  • 選択されている対象がそれ以外の場合は、選択されているフォルダとファイル(フォルダ以下は見ない)

【実行例1】 
test_folder フォルダを1つ選択した場合、以下がクリップボードにコピーされる。(そのままExcelに貼り付けた例)
 ※ジャンクションやシンボリックリンクは実際に実体があるかのように表示される

 Copy_files_007

【実行例2】
test_folder直下の全フォルダとファイルを選択した場合

 Copy_files_008

 
 
3.tree情報をコピー

選択されている対象がフォルダ1つの時のみ dosコマンドの tree文の結果をコピー、それ以外が選択されているときはエラー。

【実行例】 
test_folder フォルダを1つ選択した場合、以下がクリップボードにコピーされる。
※ジャンクションやシンボリックリンクは実際に実体があるかのように表示される
 

 フォルダー パスの一覧:  ボリューム XXXXXXXXXX
 ボリューム シリアル番号は XXXXXXXXXXXXXX です
 E:\TEST_FOLDER
 │  file01.txt
 │  file02.txt
 │  file11_HL.txt
 │  file12_SL.txt
 │  file21.txt - ショートカット.lnk
 │ 
 ├─folder1
 │      file11.txt
 │      file12.txt
 │      
 ├─folder1_JC
 │      file11.txt
 │      file12.txt
 │      
 ├─folder2
 │      file21.txt
 │      file22.txt
 │      
 └─folder2_SL
         file21.txt
         file22.txt

 
■各バッチファイルのダウンロード

以下のリンクを右クリックし、メニューから「名前を付けてリンク先を保存」や「対象をファイルに保存」などを選択しダウンロードする。(文字コードは SJISを使っているため web上で表示した場合は文字化けするので注意。)

「1_copy_filenames.bat.txt」をダウンロード

「2_copy_file_info_for_Excel.bat.txt」をダウンロード

「3_copy_tree_info.txt」をダウンロード

 
■実装手順

  1. 使いたいバッチファイルをダウンロードし、ファイル名の最後の「.txt」を削除してから保管したいフォルダに移動する。
  2. エクスプローラでパスを入れるところで「shell:sendto」と入力して、SendTo フォルダを開く。
    私の場合(Windows10 Home)は以下のフォルダである。
      C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\SendTo
  3. 1のバッチファイルのショートカットを 2の SendToフォルダの直下に作成し、名称を判りやすいものに変更する。
    「送る」メニューは名前順に表示されるので、なるべく並んで表示されるよう、先頭の名称を合わせた方が良い。
    私の場合、以下のように「copyN:」を先頭に付けている。

 
 Copy_files_009

 
今、会社でこれらのバッチを使用しているが、なかなかいい感じだ

では。
 

【2020年5月6日追記】
 
2.Excel用ファイル情報をコピー
3.tree情報をコピー

のスクリプトに、パスに空白が含まれている場合に正しく動作しないという不具合があったので修正した。

 

【2020年5月6日追記】

VBScript で動作する改良版を作成したので興味のある方は以下の記事へ。

エクスプローラからファイル一覧を出力するVBScript(検索結果もOK)

 

| | コメント (0) | トラックバック (0)

« 2017年5月 | トップページ | 2017年8月 »