Last-modified: 2016-12-20 (火) 10:12:36
cmd/チートシート

標準出力、標準エラー出力の一括リダイレクト

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
-
!
-
!
REM 新規
<コマンド> > <出力先パス> 2>&1
REM 追記
<コマンド> >> <出力先パス> 2>&1

フォルダを再帰的に処理

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
-
-
|
!
 
@echo off
 
REM 例. カレントフォルダ以下の*.datをfoo.exeに渡し、同名.txtに結果をリダイレクト
for /R %%i in ( *.dat ) do (
     if exist %%i foo.exe "%%i" > %%~ni.txt
)
pause
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
 
 
-
-
|
|
!
 
@echo off
 
REM 例. カレントフォルダ以下のフォルダパスとファイル名を列挙
for /R /D %%i in ( * ) do (
    echo %%i
    dir /b %%i
)
pause

現在時刻の文字列を生成

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
-
!
 
 
-
!
 
 
REM YYYYMMHH 文字列の生成
set dateString=%date:/=%
echo %dateString%
 
REM YYYYMMDDhhmmss 文字列の生成
set timeTemp=%time: =0%
set dateTimeString=%date:/=%%timeTemp:~0,2%%timeTemp:~3,2%%timeTemp:~6,2%
echo %dateTimeString%

パス文字列からファイル名を取得

for文内もしくは、バッチパラメータとしてなら以下の修飾子が使えるが、通常の変数に対しては使えないため一工夫

   %~I         - すべての引用句 (") を削除して、%I を展開します。
   %~fI        - %I を完全修飾パス名に展開します。
   %~dI        - %I をドライブ文字だけに展開します。
   %~pI        - %I をパス名だけに展開します。
   %~nI        - %I をファイル名だけに展開します。
   %~xI        - %I をファイル拡張子だけに展開します。
   %~sI        - 展開されたパスは短い名前だけを含みます。
   %~aI        - %I をファイルの属性に展開します。
   %~tI        - %I ファイルの日付/時刻に展開します。
   %~zI        - %I ファイルのサイズに展開します。
   %~$PATH:I   - PATH 環境変数に指定されているディレクトリを
                  検索し、最初に見つかった完全修飾名に %I を
                  展開します。
                  環境変数名が定義されていない場合、または検索
                  してもファイルが見つからなかった場合は、この
                  修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:
   %~dpI       - %I をドライブ文字とパスだけに展開します。
   %~nxI       - %I をファイル名と拡張子だけに展開します。
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 
 
-
|
!
 
-
!
 
 
 
 
 
 
 
-
!
 
 
@echo off
 
set inputFileName=test.dat
if not "%1"=="" (
    set inputFileName=%1
)
 
REM ラベルに飛ばして修飾子を利用
call :GetFileName %inputFileName%
set resultFileName=%RetGetFileName%_result.xml
 
echo %inputFileName%
echo %resultFileName%
pause
exit 0
 
REM パスからファイル名を取得し変数に入れる
:GetFileName
set RetGetFileName=%~n1
exit /b 0

エラー判定

判定したいexeが、異常を全て標準エラー出力に出してくれる場合のみ利用可能

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 
 
 
-
!
 
-
!
 
-
-
|
|
|
-
|
!
!
 
 
@echo off
 
set fooErrorFile=foo_error.txt
 
REM 以前のファイルを削除
del %fooErrorFile% > NUL 2>&1
 
REM foo.exeを実行し、エラーを判定
echo === foo変換 開始
foo.exe 2> %fooErrorFile%
for %%i in (%2\%fooErrorFile%) do (
    if not %%~zi == 0 (
        echo error:foo変換に失敗しました。%fooErrorFile%を確認して下さい。
        pause
        exit 1
    ) else (
        del %2\%fooErrorFile%
    )
)
 
exit 0

バッチ自身の位置へ移動

ファイルをドラッグアンドドロップして、中で相対パス移動するようなバッチに使う

Everything is expanded.Everything is shortened.
  1
  2
  3
-
|
!
REM カレント位置を自身のカレントディレクトリに移動
REM pushdが必要なければ、cd /d %~dp0 でもOK
pushd %~dp0