• ベストアンサー

バッチファイルで前後6ヶ月の年月を取得したい

DOSのバッチファイルで起動時に年月(西暦:YYYYMM)をパラメタとして渡して、バッチの中で前後6ヶ月の年月求めたいのですが、どなたか教えてもらえないでしょうか?。 【バッチ起動例】 AAA.bat 201105 とすると、前:201011 後201111を求めたいです。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.3

月の範囲は01から12ですから、たとえば2011年mm月なら6を足すと201107から201118になります。また6を引くと201095から201106となります。 ここで、足す場合の下2桁が13~18の場合は、+100 -12 (一年進めて12を引く)すればよく逆に引く場合で下2桁が0または95~99の場合は、 -100 +12 (一年戻して12を足す)すればいいわけです。 これをバッチにすると次のようになります。 echo off if "%1"=="" exit /b set /a ans1= %1 - 6 set /a ans2= %1 + 6 :引く場合 set /a tmp= ans1 %% 100 if %tmp% EQU 0 set /a ans1=ans1-100+12 if %tmp% GTR 88 set /a ans1=ans1-100+12 :足す場合 set /a tmp= ans2 %% 100 if %tmp% GTR 12 set /a ans2=ans2+100-12 echo %1 前:%ans1% 後:%ans2%

その他の回答 (2)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

「バッチの中で前後6ヶ月の年月求めたい」と書いているから、バッチファイルの問題を自分で解決できるようになりたいということかな? もし、ただ結果がほしいなら、バッチファイルの中で求めなくても、バッチファイルを実行する前に計算してから下のようにバッチファイルを実行すればいいだけだからね。 AAA.bat 201105 201011 201111 ここから解説ね。 単純に YYYYMM から数字を足したり引いたりした場合、MM が 12 を超えたり、逆に MM が 98 とかになってしまうよね。このようなときは、変数の文字列の年と月を分けて別の変数に入れるといいよ。 文字列を分ける機能はこれだよ。 Set /? (Set のヘルプ)より引用 | また、展開の副文字列を指定することもできます。 | | %PATH:~10,5% | | は、PATH 環境変数を展開し、展開結果の 11 番目 (オフセット 10) の文字 | から始まる 5 文字だけを使います。 Set YYYYMM=%1 Rem 年の部分を取り出す。 Rem 西暦9999年を超えるときは、このやり方だと失敗するから、 Rem どうすればいいか Set のヘルプをよく読んで考えてみて! Set YYYY=%YYYYMM:~0,4% Rem 月の部分を取り出すのは書いてみて! Set MM=______________ 次に、月から 6 を足したり引いたりした月を求めるよ。 それには、文字列を数字として計算することになるけれど、 そのための機能がこれだよ。 Set /? (Set のヘルプ)より引用 | SET コマンドには、2 つの新しいスイッチが追加されています: | | SET /A 式 | SET /P 変数=[プロンプト文字列] | | /A スイッチは、等号の右側の文字列が、評価すべき数式であることを | 指定します。 でもその前に、数字として計算させるには、正しい数字の文字列にする必要があるよ。 月(MM) が "08" や "09" のときは数字として正しい文字列じゃないから、"8" や "9" に変更するね。 If %MM%==08 Set MM=8 If %MM%==09 Set MM=9 どうして、"01" から "07" は変更しないのかというと、01 から 07 は 8進数として正しい数字の文字列だからだよ。 Rem MM に 6 を足す Set /A MM_PLUS6=%MM% + 6 Rem MM から 6 を引くのは書いてみて! Set /A MM_MINUS6=________ 次に、MM_PLUS6 が 12 を超えてしまったときだけど、 年(YYYY) に 1 を足して、 月(MM_PLUS6) から 12 を引けばいいね。 ある条件を満たすときだけ、何か処理をさせたいときに、上でも If を使ったけど、たいていは文字列の比較だよね。 今回は数字を比較するから、If の /I スイッチを使うよ。 If /? (If のヘルプ)より引用 | コマンド拡張機能を有効にすると、IF は次のように変更されます: | | IF [/I] 文字列1 比較演算子 文字列2 コマンド | IF CMDEXTVERSION 番号 コマンド | IF DEFINED 変数 コマンド | | 比較演算子は、次のいずれかです: | | EQU - 等しい | NEQ - 等しくない | LSS - より小さい | LEQ - 以下 | GTR - より大きい | GEQ - 以上 | | /I スイッチを指定すると、文字列は、大文字と小文字を区別せずに比較され | ます。/I スイッチは、IF の 文字列1==文字列2 形式で使うこともできます。 | この比較は汎用であり、文字列1 と 文字列2 が両方とも数字だけを含む場合 | は、文字列が数値に変換され、数値の比較が行われます。 Set YYYY_POST=%YYYY% Rem MM_PLUS6 が 12 を超えたとき If /I %MM_PLUS6% GTR 12 ( Set /A YYYY_POST=%YYYY% + 1 Rem ※ YYYY が 1000 を下回るとき、たとえば 0999 は Rem 数字として正しくない文字列だから、計算する前に Rem どうすればいいか考えてみて! Set /A MM_PLUS6=%MM_PLUS6% - 12 ) 次に、MM_MINUS6 が 1 を下回ったときけど、これは考えてみて! 最後に、年と月をくっつけるよ。 でも MM_PLUS や MM_MINUS が一桁のときは、たとえば "03" ではなくて "3" になっているよ。 だから、一桁のときは If /I を使って、どうすればいいか考えてみて! If /I __________________ If /I __________________ Set YYYYMM_POST=%YYYY_POST%%MM_PLUS6% Set YYYYMM_PRE=%YYYY_PRE%%MM_MINUS6% バッチファイルは、Set と If と、ここでは出てきていないけどとても重要な For をマスターすれば、ほとんどのことは自分で解決できるようになるよ。 じっくり、ヘルプを読んでマスターしてね。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

私も回答にかかわった次の質問で用いられている技法を流用すればコーディングできるように思います。 http://okwave.jp/qa/q6693676.html

関連するQ&A

専門家に質問してみよう