バッチファイルでもっとも(?)簡単にYYYYMMDD形式を設定する方法
バッチファイルでログのファイル名に日付・時間をつける方法
で紹介したので一番短いのはこれ。
c:\>set YYYYMMDD=%Date:~0,4%%Date:~5,2%%Date:~8,2% c:\>echo %YYYYMMDD% 20110213
実際にログファイル名に使うときには、%YYYYMMDD%.logとかにすればいいけど、
正直覚えらせません。
この方法を紹介したら、反撃をくらったもっといい方法を教えてもらった。
なるほど、/を置換すればいいのか
c:\>set %YYYYMMDD%=%date:/% c:\>echo %YYYYMMDD% 20110213
気になるモノ
【お題】環境変数からファイル名や拡張子を自由に取り出す方法
バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法
ふか 2011/02/02 13:21
これって引数ではない普通の環境変数ではできませんか?
お題もらいました。
バッチファイル、コマンドプロンプトで環境変数を展開したいとな。
「%~修飾子引数」だから、素直にやろうとすると、ドライブ文字だけに展開するならこうだよな。
c:\>echo %~dWINDIR% %~dWINDIR% c:\>echo %~d%WINDIR% %~dC:\WINDOWS
両方だめだ。
あれこれ順番を入れ替えてみる
c:\>echo %WINDIR~d% %WINDIR~d% c:\>echo %WINDIR%~d C:\WINDOWS~d c:\>echo %WINDIR%%~d C:\WINDOWS%~d
全部ダメ
set /?に載ってる置換で試す
c:\>echo %WINDIR:~d% %WINDIR:~d% c:\>echo %WINDIR:~d%WINDIR%% %WINDIR:~dC:\WINDOWS% c:\>echo %WINDIR:~d%% %WINDIR:~d%%
ダメやね。
( ̄~ ̄;) ウーン
for文を使ったこの方法しか思いつかんな。
c:\>for /F %i IN ('echo %WINDIR%') DO echo %~di c:\>echo C: C:
これなら、環境変数を引数にして渡したほうが楽かな。
スマートな方法をご存じの方教えてください。
バッチを吐き出すなんて方法もありか。
@set temp_cmd=%~dp0temp.cmd @echo @set result=%%~d1 >"%temp_cmd%" @call "%temp_cmd%" %WINDIR% @del "%temp_cmd%" @echo %result%
気になるモノ
シェルを指定できるタブ型コマンドプロンプトConsole + nyacusを試してみた
今、ckw + nyaousを使っている、5つぐらいckwを立ち上げるときもある。
そのときは、ckwもタブ型だったらなと思うことがある。
FirefoxもThunderbirdも秀丸など、だいぶ前からタブ型が主流で、それに慣れてしまったせいだろう。
Google RSSリーダーでよさそうなソフトが目に止まった。
ckw + nyaosからConsole2 + nyaosに乗り換え
http://sourceforge.net/projects/console/
タブ型コンソール。シェルは最近お気に入りのnayosを設定。
console.exeを起動して、Edit->SettingsでShellにnyaosのexeを指定する。
Cygwinはあんまり入れようと思わない。
シェルを指定できるタブ型コマンドプロンプト console。これは知らなかった。
Cygwinを入れないのは僕も同じ。
僕は、ckw + nyacusを使ってる。(nyacusではなくて、nyaousというのもあるのだろうか?)
追記
nyaousじゃなくて、NYAOSかな?
NYAOS.ORG
以下のように名前が統一されたようだ。
2.x 3.x NYADOS - DOS,Windows9x用 ----+ PNG NYACUS - Windows2000,XP用 ----+----- NYAOS NYAOS/2 - OS/2用 ----+
consoleを試してみる。
海外のソフトウェアだと日本語の表示、入力が気になるところ。
日本語を試す
細かい設定の前に、一番気になる日本語周りを試す
シェルの変更
nyacusに期待して、設定変更
日本語を試す
改めて、日本語ディレクトリ、日本語ファイルを試す。
日本語ディレクトリ
日本語ファイル
ダメだ。
文字化けするわけではないので、全く使い物にならないわけではない。
かつclsで一旦クリアーすれば直る
だが、それを毎回するのは面倒だ。
残念ながら今回の採用については、見送らせて頂きたいと存じます。
やはり ckw + nyaousだな。
あと、GNU utilities for Win32もあれば、いいだろう。
気になるモノ
バッチファイル/コマンドプロンプトで環境変数が設定されているかをチェックする方法
環境変数が設定されているかをチェックする方法
2パターンを紹介する。
IF文を使う
検索する方法
構文
set |findstr ^環境変数名= >nul 2>nul if NOT {%ERRORLEVEL%} == {0} コマンド
環境変数が設定されてなかった、コマンドを実行する
「設定されていたら」の条件にしたい場合は、NOTを
削除すればいい。
例
C:\>set |findstr ^ENV= >nul 2>nul C:\>if NOT {%ERRORLEVEL%} == {0} echo ENV not defined ENV not defined C:\>set |findstr ^windir= >nul 2>nul C:\>if NOT {%ERRORLEVEL%} == {0} echo windir not defined C:\>
気になるモノ
抗菌・アロマ・LED機能がついた、うるおい細霧ミスト加湿器【即納】アピックス(APIX) アロマ加... |
バッチファイルでログのファイル名に日付・時間をつける方法
日付:YYYYMMDD(年月日)形式を設定その1
forコマンドを使う
for /F "eol=;tokens=1,2,3,4*delims=/, " %i in ('date /t') DO SET YYYYMMDD=%i%j%k
実行結果
D:\workspace\batch_SandBox\>for /F "eol=;tokens=1,2,3,4*delims=/, " %i in ('date /t') DO SET YYYYMMDD=%i %j%k D:\workspace\batch_SandBox\>SET YYYYMMDD=20101203 D:\workspace\batch_SandBox\>set YY YYYYMMDD=20101203
日付:YYYYMMDD(年月日)形式を設定その2
以下でもできる。
set YYYY=%Date:~0,4% set MM=%Date:~5,2% set DD=%Date:~8,2% set YYYYMMDD=%Date:~0,4%%Date:~5,2%%Date:~8,2%
実行結果
D:\workspace\batch_SandBox\>set YYYY=%Date:~0,4% D:\workspace\batch_SandBox\>set MM=%Date:~5,2% D:\workspace\batch_SandBox\>set DD=%Date:~8,2% D:\workspace\batch_SandBox\>set YY YYYY=2010 D:\workspace\batch_SandBox\>set MM MM=12 D:\workspace\batch_SandBox\>set DD DD=03
時間:HHMM(時分)形式を設定
for /F "eol=;tokens=1,2,3*delims=:, " %i in ('time /t') DO SET HHMM=%i%j
実行結果
D:\workspace\batch_SandBox\>for /F "eol=;tokens=1,2,3*delims=:, " %i in ('time /t') DO SET HHMM=%i%j D:\workspace\batch_SandBox\>SET HHMM=2337 D:\workspace\batch_SandBox\>set HH HHMM=2337
ログ出力
設定した環境変数をファイル名に指定して出力する。
echo test >%YYYYMMDD%%HHMM%.log
出力例
D:\workspace\batch_SandBox\>echo test >%YYYYMMDD%%HHMM%.log D:\workspace\batch_SandBox\>type 201012032337.log test
バッチファイルで実行するときの注意
バッチファイルで実行する場合には、上記の例の%を%%にする必要がある。
REM YYMMDDHHMMの形式の形式を設定する @ECHO OFF For /F "eol=;tokens=1,2,3,4*delims=/, " %%i in ('date /t') DO SET YYYYMMDD=%%i%%j%%k For /F "eol=;tokens=1,2,3*delims=:, " %%i in ('time /t') DO SET HHMM=%%i%%j set YYYYMMDDHHMM=%YYYYMMDD%%HHMM% echo test >%YYYYMMDDHHMM%
「サービス」を起動するバッチファイル
Windowsでサービス状態一覧を表示するコマンドがないのはなぜだろうか?
Windowsでサービス状態一覧を表示するコマンドがないのはなぜだろうか?(VBScript編)
コマンドプロンプトで、サービスの一覧を表示、確認する方法を書いたが、
「サービス」の画面を開いて操作した方が早い場合もある。
VMWare XXXのように連続してるサービスを起動とか、■▶ ボタンでの再起動など。
基本的にコントロールパネル > 管理ツール > サービス にあるのだが、
Windows 7は、コントロールパネルの表示がアイコン表示になっていればいいが
「カテゴリ」になっていたりして、どこに管理ツールがあるのか戸惑うことがある。
テストマシンとかは、表示方法がマチマチだから。
そのため、バッチファイル化しておけば、どのWindowsでもサクっと起動させることができる。
@echo off start %SystemRoot%\system32\services.msc /s
Windowsでサービス状態一覧を表示するコマンドがないのはなぜだろうか?
Windows Nのころから、Windowsのサービスを起動、停止すことはできた。
net コマンド
起動
net start "サービス名"
停止
net stop "サービス名"
でも状態を確認するコマンドはなかった。
以下のコマンドがあってもいいのにないつも思ってた。
Windows XPからscコマンドが増え、サービスをコントロールをできるようになり、
ステータスの表示もできるようになった。
しかし、このコマンドの表示結果を検索しようとすると不便なのだ。
まずは、scコマンドとバッチで状態一覧を表示するようにしてみる。
scコマンドでの表示
sc query state= all type= service
SERVICE_NAME: Alerter DISPLAY_NAME: Alerter TYPE : 20 WIN32_SHARE_PROCESS STATE : 4 RUNNING (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: ALG DISPLAY_NAME: Application Layer Gateway Service TYPE : 10 WIN32_OWN_PROCESS STATE : 4 RUNNING (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: AntiVirSchedulerService DISPLAY_NAME: Avira AntiVir TYPE : 110 WIN32_OWN_PROCESS (interactive) STATE : 4 RUNNING (NOT_STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: AntiVirService DISPLAY_NAME: Avira AntiVir Guard TYPE : 110 WIN32_OWN_PROCESS (interactive) STATE : 4 RUNNING (NOT_STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: Apache2.2 DISPLAY_NAME: Apache2.2 TYPE : 10 WIN32_OWN_PROCESS STATE : 1 STOPPED (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 1077 (0x435) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: Apple Mobile Device DISPLAY_NAME: Apple Mobile Device TYPE : 10 WIN32_OWN_PROCESS STATE : 4 RUNNING (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: AppMgmt DISPLAY_NAME: Application Management TYPE : 20 WIN32_SHARE_PROCESS STATE : 1 STOPPED (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 1077 (0x435) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: aspnet_state DISPLAY_NAME: ASP.NET TYPE : 10 WIN32_OWN_PROCESS STATE : 1 STOPPED (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 1077 (0x435) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 SERVICE_NAME: ATKKeyboardService DISPLAY_NAME: ATK Keyboard Service TYPE : 110 WIN32_OWN_PROCESS (interactive) STATE : 4 RUNNING (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 ・ ・ ・
scコマンドで必要な情報だけ抽出する3行ごとの表示
@echo off for /F "eol=; tokens=1,2* delims= " %%i in ('"sc query state= all type= service"') DO echo %%i %%j %%k |findstr "SERVICE_NAME DISPLAY_NAME STATE"
SERVICE_NAME: Alerter DISPLAY_NAME: Alerter STATE : 4 RUNNING SERVICE_NAME: ALG DISPLAY_NAME: Application Layer Gateway Service STATE : 4 RUNNING SERVICE_NAME: AntiVirSchedulerService DISPLAY_NAME: Avira AntiVir STATE : 4 RUNNING SERVICE_NAME: AntiVirService DISPLAY_NAME: Avira AntiVir Guard STATE : 4 RUNNING SERVICE_NAME: Apache2.2 DISPLAY_NAME: Apache2.2 STATE : 1 STOPPED SERVICE_NAME: Apple Mobile Device DISPLAY_NAME: Apple Mobile Device STATE : 4 RUNNING SERVICE_NAME: AppMgmt DISPLAY_NAME: Application Management STATE : 1 STOPPED SERVICE_NAME: aspnet_state DISPLAY_NAME: ASP.NET STATE : 1 STOPPED SERVICE_NAME: ATKKeyboardService DISPLAY_NAME: ATK Keyboard Service STATE : 4 RUNNING SERVICE_NAME: AudioSrv DISPLAY_NAME: Windows Audio STATE : 4 RUNNING ・ ・ ・
1行に表示する ステータス サービス名 ディスプレー名の順
@echo off setlocal for /F "eol=; tokens=1,2* delims=:" %%i in ('"sc query type= service state= all" ') DO call :SERVICE "%%i %%j %%k" GOTO :END :SERVICE for /F "tokens=2" %%i in ('echo "%~1" ^|findstr SERVICE_NAME' ) DO set SERVICE_NAME=%%i && SET SNFLAG=ON for /F "eol=; delims=:" %%i in ('echo "%~1" ^|findstr DISPLAY_NAME' ) DO set DISPLAY_NAME="%%~i" && SET DNFLAG=ON for /F "tokens=4" %%i in ('echo "%~1" ^|findstr STATE') DO set STATE=%%i && SET SFLAG=ON if {%SNFLAG%}=={ON} ( if {%DNFLAG%}=={ON} ( if {%SFLAG%}=={ON} ( call :PRINT SET SNFLAG=OFF SET DNFLAG=OFF SET SFLAG=OFF ) ) ) GOTO :EOF :PRINT echo %STATE:~0,7% %SERVICE_NAME% %DISPLAY_NAME:~14,-4% GOTO :EOF :END endlocal
RUNNING Alerter Alerter RUNNING ALG Application Layer Gateway Service RUNNING AntiVirSchedulerService Avira AntiVir RUNNING AntiVirService Avira AntiVir Guard STOPPED Apache2.2 Apache2.2 RUNNING Apple Apple Mobile Device STOPPED AppMgmt Application Management STOPPED aspnet_state ASP.NET RUNNING ATKKeyboardService ATK Keyboard Service RUNNING AudioSrv Windows Audio RUNNING BITS Background Intelligent Transfer Service ・ ・ ・
ただ、残念なことに、これは遅すぎる。