« 2対1 | トップページ | 通知領域を見ていない »

2022年11月25日 (金)

touchコマンドもどき

朝からとてもいい秋晴れ。

太陽が出ていると、実際の気温以上に暖かく感じる。

 

随分前に、Unix/Linuxのtouchコマンドを、Windowsでも使いたいと思って調べたことがある。

Unix/Linuxのtouchコマンドは、指定したファイルがなければ、そのファイルを作成し、あれば、そのファイルの更新日時を最新にしてくれる。

自分的には、前者の機能はあまり必要性はなく、後者のファイルの更新日時を最新に出来ればいい。

その時に得た情報で作ってみたものの、うまく動く時と動かない時があって、それでも、まぁいいか、と思ってそのままにしていた。

ふと思って、改めてWindowsでtouchコマンドもどきについて調べてみたら、なんとまぁ、ものすごく簡単な方法が出てきた!

「copy ファイル名+」

なんと、copyコマンドを使って実現出来ている!

ファイル名の後に、「+」を追加するだけ。

「+」というのは、ファイルの結合オプションで、その後に、ファイル名を記述せず、「空ファイル」を結合させることによって、更新日時を最新にしているそうだ。

こんな裏技的なものがあったとは。

ということで、それをバッチファイルに。

引数のファイルが1つでいいなら。

@echo off

%~d1
cd "%~dp1"
copy "%~nx1"+

バッチ・ファイル名は何でもよく、わかりやすく「touch.bat」にでもしておく。

これを、Explorerの右クリックのコンテキストメニュー内にある「送る(C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\SendTo)」に、このバッチファイルのショートカットを作成すればいい。

copyコマンドに「+」を使う時の注意点としては。

・存在しないファイルの時はエラーになる

とのこと。

上記では、ファイルの有無はチェックしていない。

Explorer上でファイルを選択し、Explorerのコンテキストメニューからこのバッチファイルを選ぶことを前提にしているので。

複数ファイルに対応するなら。

@echo off

for %%f in (%*) do (
%%~df
cd "%%~dpf"
copy "%%~nxf"+
)

前者より、この方が応用性はある。複数のファイルを指定出来るからね。

どちらも同じ処理をしているのだけれど、一応、説明。

1行目は、ドライブに移動。
2行目は、そのファイルのフォルダに移動。
3行目で、touchをして、更新日時を最新にしている。

なんでこんなまどろっこしいやり方かと言うと、

「copy フルパス\ファイル名+」

のような指定は出来ないから。

面倒だけれど、そのファイルのある場所に移動しないといけない。

「"」でくくっているのは、フォルダ名やファイル名に「スペース」がある場合を考慮して。

とまぁ、こういう感じ。

格好良く、変数を使ってもいいのだけれど、単純なものだから、変数は使わなかった。

なんで以前調べた時に、この情報が出てこなかったのだろう??
いや、気付かなかったのだろう、だな。
不思議だ。(笑)

参考。

Windows OSでファイルの最終変更時刻を更新する(touchコマンドを実現する):Tech TIPS - @IT

 

但し、このやり方では、ファイルしか対応出来ない。

つまり、フォルダの更新日時を最新には出来ない。

もしするなら、Powershellで実行するしかなさそう。

こうすれば、ファイルにもフォルダにも対応出来る。

@echo off

for %%f in (%*) do (
powershell.exe -Command Set-ItemProperty -path """%%f""" -Name LastWriteTime -Value "$(Get-Date)"
)

ファイル、フォルダを区別せず、両方に対応するなら、これでいいだろう。

 

以下は、出来る人なら、ということで。

もし、レジストリ「HKEY_CLASSES_ROOT\Directory\Background\shell」にこのバッチファイルを登録出来るなら(ここでは割愛)、新規ファイル作成機能も追加したもの。

このレジストリは、Explorer画面右側の、何もないところを右クリックした時に出るコンテキストメニュー。

@echo off

setlocal enabledelayedexpansion

rem Explorerのバックグラウンドを選択した時、新規にファイルを作成
if "%1" == "" (
echo ファイルを作成
echo.

set f=
set /P f="作成するファイル名を入力 or (q)uit >> "
echo.
echo ファイル「!f!」を作成
if !f! equ q (
goto:eof
) else (
type nul > "!f!"
)

timeout 5
) else (
for %%f in (%*) do (
powershell.exe -Command Set-ItemProperty -path """%%f""" -Name LastWriteTime -Value "$(Get-Date)"
)
)

endlocal

引数がなければ、ファイル作成処理に入る。

対話式のコマンドプロンプトが現れるので、そこに、新規作成したいファイル名を入力すると、そのフォルダに、そのファイルを作成する。

いちいち、コンテキストメニューの「新規作成」の方で作成し、リネームしなくても、一気に希望のファイル名のファイルが出来るので、これはこれで便利。

 

これでやりたかったことが実現し、ちゃんと動くようになったし、長年放置していたことが解決して、長年の気持ち悪さがスッキリしたのである。(笑)

|

« 2対1 | トップページ | 通知領域を見ていない »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 2対1 | トップページ | 通知領域を見ていない »