• ベストアンサー

バッチファイルで前後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

  • バッチファイル作成について

    WindowsXP環境で、CD-ROMを入れたら、指定したフォルダにCD-ROM内のファイルをコピーする処理をしたいです。 自分の思考では、AUTORUN.inf と aaa.bat(バッチファイル)で処理をしようと思っています。 ***例*** AUTORUN.inf(ファイル内容) [autorun] open=aaa.bat そこで、バッチファイルどう作成したらよいか全くわかりません・・ バッチファイルやオートランの作成手順等が記載してあるHP等を教えて頂くとありがたいです。 どうかご教授お願い致します。

  • バッチファイルコマンドについて

    毎度お世話になっております。 バッチファイルコマンドで、 わからないことがあります。 ご存知の方がおられましたら、 アドバイスを頂けますようよろしくお願い致します。 (質問内容) AAA.batファイル内からbbb.bat、ccc.batを同時にコールしたいのですが、 記述方法がわからないので教えて頂けますでしょうか。 よろしくお願い致します。

  • バッチファイルを1個だけしか起動しないようにしたい

    エクスプローラー上から バッチファイル(test.bat)を ダブルクリックしてバッチファイルを実行しています。 通常はコマンドプロンプトが1個だけ表示されて、 バッチファイルが実行して実行が終了すると コマンドプロンプトも閉じられます。 しかし、時々、 コマンドプロンプトが2個表示されることがあります。 つまり、ダブルクリックが、 1回ではなく2回実行されたと誤認識されて、 同じバッチファイル(test.bat)が 2つ起動してしまったと思われます。 当然、その後の処理はおかしくなります。 (バッチファイル(test.bat)の中に 何らかのコードを追加するなどして) 必ず1個だけしか起動しないようにすることは、 できないでしょうか。 (Windows10)

  • バッチファイルについて

    バッチファイルで titleでタイトルバーに指定したタイトルがでますが 何かの関数を使って testフォルダーのaaaフォルダーのtest.bat だけを表示させたいのですが可能ですか?? もし出来れば教えてください。 宜しくお願いします

  • バッチファイルが認識されず起動しません

    バッチファイルをダブルクリックしても、「○○○. batは有効なWin32アプリケーションではありません」と表示されて、起動できません。 ■環境:WindowsXP 64Bit版 SP3 ■以下、確認したこと (1)非常にシンプルなTEST.BATを作成したが、同じエラーが表示され起動できませんでした。   このバッチファイルの内容は cmd/k dir c: (2)Windowsの拡張子に対する関連付けは、「Windowsバッチファイル」になっていました。 (3)環境変数のPATHEXTに.BATは登録されていました。 (4)自分以外のユーザーでログオンすると、バッチは正しく動作します (5)Dos窓にバッチファイルをドラッグ&ドロップすると、正しく動作します 何かWindowsの設定がおかしいのでしょうか? とても困っています、教えてください!

  • 【バッチファイル】ファイルコピー

    E:\system\●●\[選択肢]から、あるファイル(仮にA.batとします)を AllUserのスタートアップにコピーする、 というバッチファイルを作成したいのですが どなたかご存知の方おりましたらご教示願いたいです。 ちなみに、[選択肢]の部分で、いくつかある項目の中から一つ選ぶと それをコピーするという形にしたいのです。 例えばその項目が「1:○○、2:△△、3:□□」だとして、 1を入力するとE:\system\●●\○○\A.batがコピーされるという感じです。 例)、 [選択肢]を選んでください。(ここで1or2or3を入力) ---コピー実行--- コピーされました。 というようなバッチファイルを作成したいのですが・・・ 何卒、よろしくお願い致します。

  • vbsからバッチファイル実行時の引数渡しについて

    vbsからバッチファイルを実行する時に、引数として変数を渡すことはできるでしょうか。バッチファイルは引数を受け取れる記述をしています。変数の値は常に変動します。 CreateObject("WScript.Shell").Run "C:\HULTOOL\test.bat",0 を使ってtest.batを実行しています。"C:\HULTOOL\test.bat aaa(aaa)は固定の数値ですという書き方で、バッチファイルがaaaを第一引数として受け取れることは試してできました。しかし、aaaを変数にすると成功しません。何かよい記述方法はあるのでしょうか。ご教授ください。

  • バッチファイルでのパラメータの渡し方

    Windows2000proです。 コマンドプロンプトから起動するようなツールのショートカットをデスクトップに作成するときみなさんはどうやっていますか? とりあえず思いついたのが、バッチファイルを利用する方法で、ツールのパスを""で囲んだ一行のみを記述したバッチファイルをデスクトップに作成することでうまくいきました。 ところがツールにパラメータを渡そうとするとうまく起動しなくなりました。 バッチファイルの内容は、 "ツールの絶対パス\ツール名 -パラメータ" ですが、これではだめなようです。 バッチファイルにおいて、パラメータを指定したツールの起動はどうやればよいのでしょうか? よろしくお願いします。

  • バッチファイル

    お世話になります。 バッチファイルを用いて、実行されるプログラムがあります。 私の作成したものではないので、どのようなやり取りが内部で行われているのかは、詳細はわかりません。 例えば、D:\Programフォルダーの中にプルグラムをインストールしたとすれば、引数を2つ指定して(例:aaaとbbb)、バッチファイル(test.bat)を以下のように実行すれば、プログラムは正常に作動します。 D:\Program>test aaa bbb しかし、以下の場合には、正常に作動しません。 C:\>D:\Program>test aaa bbb つまり、パスを含めて、バッチファイルを実行することは、このプログラムは許可してくれません。 ここで、例えば、VBなどを用いて、テキストボックスなどで引数を二つ指定して、実行ボタンをクリックすれば、必ず、D:\Program>test aaa bbbという状態で、バッチファイルが実行されるようにするには、どのようにすればよろしいでしょうか? もしご存知の方がいらっしゃいましたら、是非、ご教授願います。 以上、宜しくお願いいたします。

  • バッチファイルについて

    Tech Netセキュリティセンターから、更新ダウンロードした ファイルを複数同時にバッチファイルで処理したい場合、 どのようにバッチファイルを作ればいいのでしょうか?? 環境はWindowsXPです。 <1つに場合(ファイル名:test.bat)> cd "格納先" 更新ファイル名 pause ←DOS画面をストップさせる為、いちお記載 よろしくお願いします。

専門家に質問してみよう