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 | トップページ | 通知領域を見ていない »
コメント