📝

PowerShellでtouchコマンドを使う方法

2024/05/05に公開

はじめに

PowerShellってcdとかmkdirとかは使えるのに、
touchコマンドは使えないのちょっと不便だなーって思ってました。

ここではtouchコマンドを使えるようにするために、functionとaliasをprofileに記載する方法を紹介します。

※ 方法のみ確認したい方はこちらから

記事の更新

  • 2024/05/12
    関数名を変更しました。
    オプションを4つ追加しました(-a、-c、-m、-t)。

touchコマンドについて

そもそもtouchコマンドとは

touchコマンドは、「ファイルのタイムスタンプ(日付と時刻の記録)を変更することができるもの」らしいです(IT用語辞典)。

また、新規の空ファイルを作成するためにも使用されます。

(個人的には空ファイル作成の用途しか知りませんでした...)

touchコマンドで使えるオプション

IBMのページを参考にすると、touchコマンドのオプションは以下のようにまとめられます。

touch [  -a ] [  -c ] [  -m ] [  -r RefFile ] [ Time |  -t Time ] { File ... | Directory ... }
  • -a: ファイルのアクセス時刻を更新する
  • -c: ファイルがまだ存在していない場合はファイルを作成しない
  • -m: ファイルの修正時刻を更新する
  • -r: 別のファイルの時刻を参照してファイルの時刻を更新する
  • -t: 新しいタイムスタンプを指定してファイルの時刻を更新する

今回はPowerShellで以上の5つのオプションのうち、

  • -a
  • -c
  • -m
  • -t

の4つを使えるようにします。

PowerShellでtouchコマンドを使う方法

動作環境

  • Windows 11
  • PowerShell 7.4.2 (Windows Terminal)
  • Visual Studio Code

設定手順

  1. PowerShellを開きます。
  2. 次のコマンドを入力し、Microsoft.PowerShell_profile.ps1を開きます(VSCodeがインストールされていることが前提です)。
code $PROFILE
  1. 開いたps1ファイルに、以下のコードをコピペします。
function Touch-Command {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string]$FilePath,
        [switch]$a, # ファイルのアクセス時刻を更新する
        [switch]$c, # ファイルが存在しない場合はファイルを作成しない
        [switch]$m, # ファイルの修正時刻を更新する
        [string]$t # 新しいタイムスタンプを指定してファイルの時刻を更新する
    )

    # ファイルが存在しない場合かつcオプションが指定された場合は処理を中断
    if (-not (Test-Path $FilePath) -and $c) {
        Write-Warning "File '$FilePath' does not exist and -c option specified. Skipping."
        return
    }

    # ファイルが存在しない場合は新規に作成
    if (-not (Test-Path $FilePath)) {
        New-Item -Path $FilePath -ItemType File | Out-Null
    }

    # -aオプションが指定された場合は最終アクセス時刻を更新
    if ($a) {
        (Get-Item $FilePath).LastAccessTime = Get-Date
    }

    # -mオプションが指定された場合は最終変更時刻を更新
    if ($m) {
        (Get-Item $FilePath).LastWriteTime = Get-Date
    }

    # -t timeオプションが指定された場合は指定した時刻を使用して更新
    if ($t) {
        try {
            $time = [DateTime]::ParseExact($t, "yyyyMMddHHmm", $null)
            (Get-Item $FilePath).LastAccessTime = $time
            (Get-Item $FilePath).LastWriteTime = $time
        } catch {
            Write-Warning "Invalid time format for -t option. Please use 'yyyyMMddHHmm' format. Skipping."
        }
    }
}

# "touch" コマンドを Touch-Command 関数にエイリアス
Set-Alias -Name touch -Value Touch-Command
  1. 編集したps1ファイルを保存します。
  2. VSCodeを閉じ、PowerShellを再起動します(Windows Terminalを使っている方は、新しいタブを開いても大丈夫です)。

以上の手順で以下の4つのオプションを持つtouchコマンドが使えるようになります。

  • -a: ファイルのアクセス時刻を更新する
  • -c: ファイルがまだ存在していない場合はファイルを作成しない
  • -m: ファイルの修正時刻を更新する
  • -t: 新しいタイムスタンプを指定してファイルの時刻を更新する

Discussion