Posted at

コマンドプロンプトでワンライナーで日付を取得する

More than 3 years have passed since last update.

cmd-720x340.gif

前回の

コマンドプロンプトで/Cの引数をつけた時のスペースの挙動わけわからん

のリベンジです


0.作業環境


  • Windows 10 Pro

  • CLaunch 64bit 3.26

今回はいつも以上にニッチなハックです。


はじめに


「CLaunchって何だよ」


CLaunch[クランチ]はランチャー本来の使い易さと、軽さを追求したボタン型ランチャーです。


image

前回の記事のコメントでCLaunchのことに

一切触れてなかったので反省


ワンライナーにこだわる理由

SnapCrab_NoName_2016-5-9_2-23-2_No-00.png

このCLaunchというランチャーは

軽量ランチャーとしても十分有用であり、

ランチャーに登録したボタンにパラメータを付けて

動作させることが可能です。


*日付を簡単に入力したい

このパラメータを使って、

日頃ファイルやフォルダの名前を付けるために

日付を手打ちしてたので・・・

作業効率化のために、ボタンを押したら、

クリップボードにコピーされるようにしたいな、と。

普通にバッチファイルを登録しても良いんですが

妥協した気がするので

ぜひワンライナーでなんとかしたいなと


1.コマンドプロンプトで日付を取得

ワンライナーにする前にどうやって日付を持ってくるかというところから

今回は

yyyymmdd_hhmmss

という形式をクリップボードにコピーしたいので


日付を取得する

echo %date%

yyyy/mm/dd
echo %time%
h:mm:ss.00

日付等の取得は予約語があるので

難なく出来ました。


整形する


細かく取得

set yyyy=%date:~0,4%

set mm=%date:~5,2%
set dd=%date:~8,2%

set time2=%time: =0%

set hh=%time2:~0,2%
set mn=%time2:~3,2%
set ss=%time2:~6,2%
echo %yyyy%%mm%%dd%_%hh%%mn%%ss%



%hoge:~0,1%

とすると文字列の先頭から1文字を抜き出す

%hoge:abc=def%

とすると文字列からabcをdefに置換



2. CLaunchに記述する

CLaunchに書くことが出来るのは

1行なので

1行でまとめて記述します


set yyyy=%date:~0,4%&set mm=%date:~5,2%&set dd=%date:~8,2%&set hh=%time:~0,2%&set mn=%time:~3,2%&set ss=%time:~6,2%&echo %yyyy%%mm%%dd%_%hh%%mn%%ss%


最初こんな感じで”&”でつなげただけでできるかなーって思ったんですけど

失敗でした。

変数名がそのまま返されるだけで

変数に何も入ってないような挙動になってしまいました。

前回はここでずっとハマってました


Qiitaに現れた賢者達


sawa_tsuka様

一行にしようとすると遅延環境変数が必要になるので、1行で時間取得、1行で出力にしたほうが無難だと思いますが。


遅延環境変数を調べてみると

cmd /V:ON で使用できるとのこと

%ではなく!で囲む

!hoge!みたいな


3. リトライ

もうなんかめんどくさいので


retry

/V:ON /C set yyyy=%date:~0,4%&set mm=%date:~5,2%&set dd=%date:~8,2%&set time2=%time: =0%&set hh=!time2:~0,2!&set mn=!time2:~3,2!&set ss=!time2:~6,2!&echo !yyyy!!mm!!dd!_!hh!!mn!!ss!


&によって順番に処理自体はされてることがわかってたので

展開が必要な値を

全部遅延環境変数に書き換えました


出力

yyyymmdd_hhmmss


無事出力されて一安心でした。

でも多分もっとスムーズな方法があるんだろうけど・・・


4. クリップボードにコピーさせる

これは全く問題なかったです。


|clip


パイプを使ってクリップボードにコピーさせます。

ちゃんちゃん♪


5. 最終的にどうするか

image

CLaunchのボタンの設定を開き

矢印の箇所に


パラメータ

/V:ON /C set yyyy=%date:~0,4%&set mm=%date:~5,2%&set dd=%date:~8,2%&set time2=%time: =0%&set hh=!time2:~0,2!&set mn=!time2:~3,2!&set ss=!time2:~6,2!&echo !yyyy!!mm!!dd!_!hh!!mn!!ss!|clip


上記をコピペして実行すればクリップボードにコピーされた状態になるので

好きな箇所にコピペすれば手入力の手間が省けますよ。


さいごに

実はこの記事書いてる途中でFOR文を使った取得方法を

コメントでいただくことが出来ました。

簡単にではありますが紹介します。


DamashiGami様

★ 最後に例題のyyyy-mmdd-hhmmssの出力ですが

コマンドプロンプトから実行する場合
for /f "tokens=1-6 delims=/:." %0 in ("%date%.%time: =0%") do echo;%0-%1%2-%3%4%5

あ・・・そういう方法も有るんですね・・・って参考になりました。

教えていただいた方法の方がとってもクールだと思います。

batじゃなくてps1にしたら?という意見もありますが、

限定された環境下で何かをするって結構楽しかったりするんですよね。

どMですね。

なにはともあれ、色々勉強出来て、最終的に解決してほんとに良かった。


感謝

最後に前回の愚痴のような記事にコメントをくださった方に感謝を



  • sawa_tsuka

    FOR文と遅延環境変数のコメントを頂きました


  • Ted-HM

    参考になりそうな記事を教えていただきました


  • DamashiGami

    FOR文での取得のサンプルを書いてくださいました