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

![cmd-720x340.gif](https://qiita-image-store.s3.amazonaws.com/0/43608/349f9190-5d82-3fa5-514d-f348edf2b6b8.gif)

前回の
[コマンドプロンプトで/Cの引数をつけた時のスペースの挙動わけわからん](http://qiita.com/walrein/items/f71d1290df8894185aa5)
のリベンジです

# 0.作業環境

- Windows 10 Pro
- CLaunch 64bit 3.26

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

# はじめに

## 「CLaunchって何だよ」

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

![image](https://qiita-image-store.s3.amazonaws.com/0/43608/56533f82-8a04-6525-7e6b-e159713ec8a8.png)

前回の記事のコメントでCLaunchのことに
一切触れてなかったので反省

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

![SnapCrab_NoName_2016-5-9_2-23-2_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/43608/7b576c9d-ca7f-5b15-2ad6-87aded86df26.png)

このCLaunchというランチャーは
軽量ランチャーとしても十分有用であり、
ランチャーに登録したボタンにパラメータを付けて
動作させることが可能です。

### ＊日付を簡単に入力したい
このパラメータを使って、
日頃ファイルやフォルダの名前を付けるために
日付を手打ちしてたので・・・
作業効率化のために、ボタンを押したら、
クリップボードにコピーされるようにしたいな、と。
普通にバッチファイルを登録しても良いんですが
**妥協した気がするので**
ぜひワンライナーでなんとかしたいなと

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

ワンライナーにする前にどうやって日付を持ってくるかというところから
今回は
yyyymmdd_hhmmss
という形式をクリップボードにコピーしたいので

## 

```bat:日付を取得する
echo %date%
yyyy/mm/dd
echo %time%
 h:mm:ss.00
```

日付等の取得は予約語があるので
難なく出来ました。

## 整形する

```bat:細かく取得
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に現れた賢者達
```text:sawa_tsuka様
一行にしようとすると遅延環境変数が必要になるので、1行で時間取得、1行で出力にしたほうが無難だと思いますが。
```
遅延環境変数を調べてみると
cmd /V:ON で使用できるとのこと
%ではなく!で囲む
!hoge!みたいな

# 3.　リトライ
もうなんかめんどくさいので

```bat: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!
```

&によって順番に処理自体はされてることがわかってたので
展開が必要な値を
全部遅延環境変数に書き換えました

```text:出力
yyyymmdd_hhmmss
```

無事出力されて一安心でした。
でも多分もっとスムーズな方法があるんだろうけど・・・

# 4. クリップボードにコピーさせる
これは全く問題なかったです。
>|clip

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

# 5. 最終的にどうするか

![image](https://qiita-image-store.s3.amazonaws.com/0/43608/37cab979-9914-c880-7495-ea71be0db38d.png)
CLaunchのボタンの設定を開き
矢印の箇所に

```bat:パラメータ
/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文を使った取得方法を
コメントでいただくことが出来ました。
簡単にではありますが紹介します。

```bat: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](http://qiita.com/sawa_tsuka)様  
FOR文と遅延環境変数のコメントを頂きました
- [Ted-HM](http://qiita.com/Ted-HM)様  
参考になりそうな記事を教えていただきました
- [DamashiGami](http://qiita.com/DamashiGami)様  
FOR文での取得のサンプルを書いてくださいました