しぐれさんの備忘録

情報系おちこぼれだった何か

Windowsのショートカットファイルを読み込み、ファイル本体を取得する話

ショートカットに対してはリンク先を探してファイルを取ってくるツールを作るのです。



これを使う環境上、何か新しいものをダウンロードやインストールは出来ません

Javaは使えるけど、Jarは実行するためにコマンドプロンプトを開く必要があるのが地味に面倒。加えて環境によってJREのバージョンが違うから動かない、と言われると悲しくなります。

OSはWindows7 64bitで統一されています。

バッチで作るには処理が少々複雑だと考えられます。

これらを踏まえて何を使って実装するか。そうだね、VBScriptだね。初めて触ります。VBAにヘイトが溜まっている現状、パッと見似ているVBScriptを触るのがとてもこわいです。






で、作った。基本コピペなのに1時間くらいかかりました。むしろ自分でゴリゴリ書いたほうが早かった説がある。

以下、ツール概要

  • VBScriptファイルにフォルダをドロップすると、フォルダ内のファイルをtempフォルダにコピーする。
  • ショートカット(.lnk)ファイルはリンク先をtempフォルダにコピーする。
  • tempフォルダはドロップしたフォルダ直下に作成される。

仕事で使うので、いろいろとコピペしながら作ったよ。

Option Explicit
'ドロップされたパスを取得
Dim myArray
Dim objFSO, myFile, objShell, objSc, objFolder
Dim objCopiedFol, objFileInFol, objFile 'As object
Dim openPath, linkPath, copiedFolPath 'As String

Set myArray = WScript.Arguments 

'ファイルかどうかの判断用にオブジェクトを作成
Set objFSO = CreateObject("Scripting.FileSystemObject")

'ドロップされた物の判断
if objFSO.FolderExists(myArray(0)) then
	'ディクトリの場合
	openPath = myArray(0)
Else

	'ディレクトリ以外の場合
	if objFSO.GetExtensionName(myArray(0)) <> "lnk" then
		'ファイルの場合、その親のディレクトリパスを取得
		Set myFile = objFSO.Getfile(myArray(0))
		openPath = myFile.ParentFolder
	Else
		'ショートカットの場合
		'それぞれのオブジェクトを作成
		Set objShell = WScript.CreateObject("WScript.Shell")
		Set objSc = objShell.CreateShortcut(myArray(0))

		'パスを取得
		openPath = objSc.TargetPath

		'ショートカット先がファイルか判断
		If objFSO.FileExists(openPath) Then
			'ファイルの場合、その親のディレクトリパスを取得
			Set myFile = objFSO.Getfile(openPath)
			openPath = myFile.ParentFolder
		End If
	End If
End If

'フォルダ作成
copiedFolPath = openPath & "\temp"
if Not objFSO.FolderExists(copiedFolPath) then
	Set objCopiedFol = objFSO.CreateFolder(copiedFolPath)
End If

Set objFolder = objFSO.GetFolder(openPath)
For Each objFileInFol In objFolder.Files
	'msgbox objFileInFol.Name
	if objFSO.GetExtensionName(objFileInFol.Path) <> "lnk" then
		'ファイルの場合
		'msgbox openPath & "\" & objFileInFol.Name
		objFSO.CopyFile openPath & "\" & objFileInFol.Name, copiedFolPath

	Else
		'ショートカットの場合
		'それぞれのオブジェクトを作成
		'msgbox openPath & "\" & objFileInFol.Name
		Set objShell = WScript.CreateObject("WScript.Shell")
		Set objSc = objShell.CreateShortcut(openPath & "\" & objFileInFol.Name)

		'パスを取得
		linkPath = objSc.TargetPath
		'msgbox linkPath
		'ショートカット先がファイルか判断
		If objFSO.FileExists(linkPath) Then
			'ファイルの場合
			objFSO.CopyFile linkPath, copiedFolPath
		End If
	End If
Next

msgbox "完了"




なんかVB系の話しかしてない…。