実行月の1ヶ月前を取得する

:: 実行年月の1ヶ月前をYYYYMM形式で出力(バグあり)
::8月と9月の出力がおかしい

::デバッグ用
set DT1=201008
::set DT1=%date:/=%

set YYYY=%DT1:~0,4%
set MM=%DT1:~4,2%

::ゼロ埋めするかどうか
set FLG_ZERO=0
if "%MM%"=="01" goto NOT_ZERO
if "%MM%"=="12" goto NOT_ZERO
if "%MM%"=="11" goto NOT_ZERO
set FLG_ZERO=1

:NOT_ZERO

::前年月を算出
if "%MM%"=="01" (
	set /a YYYY-=1
	set MM=12
) else (
	set /a MM-=1
)

::ゼロ埋め
set YYYYMM=
if "%FLG_ZERO%"=="1" (
	set YYYYMM=%YYYY%0%MM%
) else (
	set YYYYMM=%YYYY%%MM%
)

echo %YYYYMM%

pause


原因は、08と09が10進数でなく、8進数で認識されてしまうから。
以下、set /?より抜粋。

コマンド スクリプト外でコマンド ラインから SET /A を実行すると、
式の最終的な値が表示されます。
割り当て演算子を使うには、割り当て演算子
の左側に環境変数名が必要です。
数値は 10 進数ですが、プレフィックスとして 0x
を付けると 16 進数、0 を付けると 8 進数になります。従って、0x12 は 18、
あるいは 022 と同じです。
8 進表記を使う場合は、注意してください。08 や
09 は、8 と 9 が有効な 8 進数ではないため、
有効な数値ではありません。