thumbnail 一問一答の一歩

【コマンドプロンプト】windowsでlnコマンドを使ってショ一トカットを作成する

Windowsでショ一トカットを作成するには一般的に「右クリック→ショ一トカット作成を選択」で行うことになると思います。

ただ、linuxなどでCUIに慣れてしまうと、コマンドからでもlnコマンドを同じように使えたり、シンボリックリンクとも異なるショ一トカットを作成できるようになると便利だろうなと思ったので作成しました。

なお、手順については以下の通りです。

  • 手順1:使用するには下記のソースを「ln.txtファイル」に保存
  • 手順2:拡張子を「.bat」に変更する
  • 手順3保存しているパスを通す

lnのバッチファイルのソース

@echo off
::--------------------------------------
::ディレクトリであるかどうかを判定
::--------------------------------------
if "%~1"=="/D" (
set  dir_flg= 1
) else if "%~1"=="-d" (
set  dir_flg= 1
) else if "%~1"=="=-F" (
set  dir_flg= 1
) else if "%~2"=="/D" (
set  dir_flg= 1
) else if "%~2"=="-d" (
set  dir_flg= 1
) else if "%~2"=="-F" (
set  dir_flg= 1
) else (
set  dir_flg= 0
)

::--------------------------------------
::リンクの種類の判定
::ハードリンク		……1
::シンボリックリンク……2
::ショートカット	……3
::--------------------------------------
if "%~1"=="/H" (
set  link_kind= 1
) else if "%~1"=="-h" (
set  link_kind= 1
else if "%~2"=="/H" (
set  link_kind= 1
) else if "%~2"=="-h" (
set  link_kind= 1
) else if "%~1"=="/S" (
set  link_kind= 2
) else if "%~1"=="-s" (
set  link_kind= 2
) else if "%~1"=="--symbolic" (
set  link_kind= 2
) else if "%~2"=="/S" (
set  link_kind= 2
) else if "%~2"=="-s" (
set  link_kind= 2
) else if "%~2"=="--symbolic" (
set  link_kind= 2
) else if "%~1"=="/W" (
set  link_kind= 3
) else if "%~1"=="-w" (
set  link_kind= 3
) else if "%~2"=="/W" (
set  link_kind= 3
) else if "%~2"=="-w" (
set  link_kind= 3
) else (
set  link_kind= 0
)

::--------------------------------------
::コマンドの実行
::--------------------------------------

::echo "リンクの種類:"%link_kind%
::echo "ディレクトリか?:%dir_flg%

if %dir_flg%==1 (
	if %link_kind%==1 (
		mklink /H /D %4 %3
	) else if %link_kind%==2  (
		mklink /D %4 %3
	) else if %link_kind%==3  (
		rem 	100行目以降の関数をPowershellで実行
		@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \\"%~f0\\"|?{$_.readcount -gt 100})-join\\"`n\\");&$s" %*&goto:eof
	) else (
		mklink /H /D %3 %2
	)
) else (
	if %link_kind%==1 (
		mklink /H %3 %2
	) else if  %link_kind%==2 (
		mklink %3 %2
	) else if  %link_kind%==3 (
		rem 	100行目以降の関数をPowershellで実行
		@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \\"%~f0\\"|?{$_.readcount -gt 100})-join\\"`n\\");&$s" %*&goto:eof
	) else (
		mklink /H %2 %1			
	)
)

exit /b

::--------------------------------------
::ショートカット作成関数(Powershellで実行)
::--------------------------------------

#WshShellオブジェクトを作成
$shell = New-Object -ComObject WScript.Shell

#引数に/Dか-dが入ると引数番号がずれるので場合分けする
If ($Args[0] -eq "-d" -or $Args[0] -eq "/D" -or $Args[1] -eq "-d" -or $Args[1] -eq "/D" ){
	#ショートカットパスを設定
	$linkpath = -Join ((Get-Location).Path,"\\", $Args[3],".lnk")
	#ショートカットへのオブジェクトを作成
	$lnk = $shell.CreateShortcut($linkpath)
	#リンク先パス設定
	$lnk.TargetPath = $Args[2]
}Else{
	#ショートカットパスを設定
	$linkpath = -Join ((Get-Location).Path,"\\", $Args[2],".lnk")
	#ショートカットへのオブジェクトを作成
	$lnk = $shell.CreateShortcut($linkpath)
	#リンク先パス設定
	$lnk.TargetPath = $Args[1]
}

#ショートカットを保存
$lnk.Save()

なお。参考にしたページは以下の通りです。

フォルダのパスの通し方

下記のソースを含むバッチファイルを保存したフォルダのパスを通せばいいのですが、パスの通し方については既に分かりやすい説明が書かれていたのでそちらに説明を譲ります。

使用感

なお、基本的には使用感をリナックスのlnコマンドに合わせているのですが、一部オリジナルと違っているところがあるので補足です。

まず、引数ごとにオプションは1つづつしか設定できないようになっています。

また、本来のlnコマンドで作成できるものはは「ハードリンク」、または「シンボリックリンク」の2パターンのみなのですが、これだけでは使いにくかった-wまたは/Wを指定することで、windowsで右クリックしたときのショートカットも作成できるようにしています。

なお、詳細なオプションについては下記の通りです。

  • -d:ディレクトリを対象にする
  • -h:ハードリンクを作成
  • -s:シンボリックリンクを作成
  • -w:windowsを右クリックして作れるショートカットを作成