LoginSignup
1
0

More than 5 years have passed since last update.

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

Posted at

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文での取得のサンプルを書いてくださいました
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0