0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

右クリックメニューからファイルのパス(またはファイル名)をクリップボードにコピーする VBScript

Last updated at Posted at 2021-12-25

エクスプローラでファイルを選択して[Shift]キーを押しながら右クリックすると〔パスのコピー〕というメニューが現れて、それを実行するとファイルのパスをクリップボードにコピーしてくれる。
複数選択したファイルのパスも一度にコピーしてくれるので結構便利なのだが、ダブルクォーテーション付きでコピーされるのと、ファイル名だけ欲しい場合は一旦メモ帳などに貼り付けてフォルダパスの部分を削除する必要があるのが若干面倒くさい。

そこで、右クリックメニューから複数ファイルのパス(またはファイル名)をクリップボードにコピーする VBScript を作ってみた。

ファイル名取得(昇順).vbs
' エクスプローラーで選択したファイル(複数可)をこのアイコンにDrag&Dropすると、
' ファイル名(またはパス)をソートしてクリップボードにコピーする。
' SendToフォルダにこのファイルを置くと、選択したファイルの右クリックメニューの
' [送る]でパスを取得できる。
' ※ 一度に選択できるファイル数の上限:パスの総文字数が32,699未満(Windows7、10の場合)
Option Explicit

Dim args              '// 選択したファイルパスの配列
Dim folderPath        '// フォルダのパス
Dim i                 '// 配列のループカウンタ
Dim fileNames         '// ソート前のフルパスリスト
Dim fileNamesArray    '// ソートされたフルパスの配列
Dim sortFileNames     '// ソートされたフルパスリスト
Dim msg               '// パスかファイル名かの選択メッセージ

Set args = WScript.Arguments

'// D&Dした複数ファイルのフルパスを改行で繋いだリスト(文字列)にする
folderPath = CreateObject("Scripting.FileSystemObject").GetParentFolderName(args(0)) & "\"

For i = 0 to args.Count - 2
    fileNames = fileNames & args(i) & vbcrlf
next

fileNames = fileNames & args(i) '// 末尾に改行を入れないようにするため、最後はループから外す

Set args = Nothing

'// フルパスを配列にしてソートする(フルパスは2次元目に格納されている)
fileNamesArray = SortRecordset(Split(fileNames, vbcrlf))

'// ソートされた配列を改行で繋いだリスト(文字列)にする
For i = 0 to UBound(fileNamesArray, 2)
    sortFileNames = sortFileNames & fileNamesArray(0, i) & vbcrlf
next

msg = "フォルダのパスも含めますか?" & vbcrlf & vbcrlf
msg = msg & "[はい]フルパス" & vbcrlf & "[いいえ]ファイル名のみ"

If Msgbox(msg, vbYesNo) = vbNo Then
    sortFileNames = Replace(sortFileNames, folderPath, "")
End If

CreateObject("WScript.Shell").Exec("clip").StdIn.Write(sortFileNames)   '// クリップボードにコピー
WScript.Echo "以下のファイル名リストをコピーしました。" & vbcrlf & vbcrlf & sortFileNames
'// ソート関数
Function SortRecordset(arry)
    Dim i
    With CreateObject("ADODB.Recordset")
        .Fields.Append "Field1", 200, 2047      '// 引数は、順にカラム名、型、文字バイト数
        .Open

        '// データをレコードセットに追加していく
        For i = 0 To UBound(arry)
            .AddNew
            .Fields("Field1").Value = arry(i)
        Next

        .Sort = "Field1 ASC"        '// ASC(昇順)/DESC(降順) ※省略した場合は昇順
        SortRecordset = .GetRows    '// GetRowsは2次元配列を返すので要注意
        .Close
    End With
End Function
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?