😊

PowerShellでtouchコマンド (n度目の正直)

2024/05/09に公開

追記 (即日)

完璧に欲しいものが既にありました(当然)。
意外と見つけられないものですねぇ。こういう日が一番辛い。

結論

# ~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
function touch() {
    foreach ($file in $args) {
        if ( Test-Path -Path $file ) {
            Set-ItemProperty $file -name LastWriteTime -value (Get-Date) > $null
        } else {
            New-Item $file > $null
        }
    }
}

#おまけ にもスクリプトがあるよ

補足解説

$PROFILE を編集する

詳細: Microsoftのドキュメント / about_Profiles

.bashrcだとか、シェル実行時に起動するファイルのPowerShell版は$PROFILE変数に格納されています。
Windowsでは

PS $ echo $PROFILE
C:\Users\<username>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

ここに普段使いたいコマンドエイリアス等を記述しておくと、いつでも記述したエイリアスを参照できるようになります。やったね。

.ps1を記述する場合は、移植性が下がるので要注意。
あなたのプロファイル記述なんて他人は知りません。

必要な関数を手動インクルードで対応はできますが...。簡単なコマンドはインライン展開 (PowerShellで元から使えるコマンドに書き換え) した方が読み手に優しいと思います。

$null 変数って何

詳細: Microsoftのドキュメント / $nullについて...

一般的なnull値としての使い方の他、/dev/nullとしても扱えます。
> $nullでは、標準出力を破棄すると同義ですね。頻出です。

わざわざ出力を明示的に破棄してあげないと、たった1つファイルを作るだけで10行もの出力が返ってきます。
ちなみにLinux、手前のWSL環境のDebianでは0行。IKWID、エラー以外のレスポンスは不要です。

Q&A

Q. -aとかのオプションは?
A. (書き手の)手軽さに欠く為ありません。Get- Set-なんちゃらかWSLを使いましょう。

おまけ

mkdirも出力を黙らせてみた

function mkdir() {
    New-Item $args -ItemType Directory > $null
}
Set-Alias -Name md -Value mkdir -Option AllScope

関数は何の警告もなしにAllScopeコマンドを上書きできますが、Set-Alias-Option AllScopeを明示しないとエラー落ちします。

Discussion