素人の備忘録。
動機
PowerShellのcd
(Set-Location
)をもうちょっと使いやすくしたい。
-
cd
の後に自動でls
してもらいたい - ショートカット(.lnkファイル)にも対応してもらいたい
- ディレクトリのショートカットならそのフォルダへ移動
- ファイルのショートカットなら元ファイルがあるディレクトリへ移動
解決策
cd
の後に自動でls
以下の関数を使うとcd
の後に自動でls
してくれる。
参考:code: Coreutils-style ‘ls’ for Windows Powershell
# cdの後に自動でls
function cd-ls {
param($path)
try {
set-location $path -erroraction 'stop'
ls
}
catch {"$_"}
}
ショートカット(.lnkファイル)にも対応
まずショートカットの情報を得るフィルターを作る。
参考:PowerShellで、ショートカット情報を得るフィルタを作ってみる
# ショートカットの情報を得る
filter Get-ShortcutProperty() {
$sh = new-object -comobject WScript.Shell
return $sh.CreateShortcut($_)
}
次に、引数が
- .lnkファイルでないならそのまま
cd-ls
- .lnkファイルなら、
- WorkingDirectoryがない(=ディレクトリの)ショートカットならTargetPathへ
cd-ls
- WorkingDirectoryがある(=ファイルの)ショートカットならWorkingDirectoryへ
cd-ls
- WorkingDirectoryがない(=ディレクトリの)ショートカットならTargetPathへ
する関数を作る。
参考:How can I follow a windows shortcut in power shell?
# ショートカット先へも移動する
function Move-Location {
param($path)
If (((Resolve-Path $path).Path).EndsWith(".lnk")) {
$ShortcutPath = Get-ChildItem $path | Get-ShortcutProperty
If ($ShortcutPath.WorkingDirectory) {
cd-ls $ShortcutPath.WorkingDirectory
} else {
cd-ls $ShortcutPath.TargetPath
}
} else {
cd-ls $path
}
}
あとは適当にエイリアスする。
Remove-Item alias:cd
Set-Alias cd Move-Location