実現したいこと
引数を与えられた場合は その引数のスラッシュ付き日付を、
引数を与えられない場合は 当日を内部でえて
最終的には 標題の目的を達成しようとしています。(2025/04/01 ===>2025/4/1 の変換)
で、自分が作成したバッチファイルは 以下です。
ノウハウがほとんどないので、echoをいれながらの Try&Errorで 作っていますが、どうにもこうにも進展せず、今回の問合せとなりました。
@echo off if "%1"=="" ( set CHECK_DATE=%date% ) else ( set CHECK_DATE="%1" ) rem ============================================== rem 日付書式の正規化 rem ============================================== set /a yyyymmdd =%CHECK_DATE:/=% echo %yyyymmdd% set /a yyyy =%yyyymmdd:~0,4% echo %yyyy% set /a mm =%yyyymmdd:~4,2% echo %mm% set /a dd =%yyyymmdd:~6,2% echo %dd% set sl ="/" echo %sl% set /a TODAY_FORMATED =%yyyy%%sl%%mm%%sl%%dd% echo %TODAY_FORMATED% exit /b 1
どうすれば変数を結合しなおして、スラッシュ付きの日付文字列を生成できるのでしょうか
発生している問題・分からないこと
年・月・日を 個々の変数に格納して、スラッシュ付きで 再結合しようとしても 上記コードでは 以下のように、スラッシュ文字が得られない問題におちっています。
D:\TRIAL>HOLIDAYJUDGER 20250424 2025 4 24 ECHO は <OFF> です。 2025424
エラーメッセージ
error
1ECHO は <OFF> です。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
あまりにも ノウハウ不足で 適合記事を見つけられません
補足###
現況のコードで 引数に8月の日付を指定したら エラーになってしまった!!!
なんでだろう??
D:\TRIAL>HOLIDAYJUDGER 2025/08/11 20250811 2025 無効な数字です。数値定数は 10 進 (17 桁)、16 進 (0x11 桁)、 または 8 進 (021 桁) です。 4 11 / 2025/4/11
"/0" を "/"に置換すればよいかと思います。
set CHECK_DATE=2025/04/01
set FORMATED=%CHECK_DATE:/0=/%
echo %FORMATED%
2025/4/1
ご見解ありがとうございます、現況以下のように変更して 一応に 期待結果を得られるようになりました。=をまたいで 左辺右辺の間にスペースが入っている・いないだけで挙動が変わってしまうのでしょうかね。。。
> 左辺右辺の間にスペースが入っている・いないだけで挙動が変わってしまうのでしょうかね。。。
はい、スペースを含む文字列として処理されますので、例えば
%CHECK_DATE:/0 = /%
とする場合には "/0 " を " /" に置換することになります。なので、文字列 2025/04/01 は置換されずにそのままになります。
> 引数に8月の日付を指定したらエラーになってしまった!!!
set コマンドで /a オプションを指定しているので、"08"が8進数として扱われるからです。
set | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/set_1
> 構文
>
> set /a <variable>=<expression>
>
> パラメーター
>
> /a <string> を評価される数値式に設定します。
>
> 数値は、0×16進数または8進数0で始まっていない限り、10進の番号です。そのため、0~12は、18の場合と同じある022と同じです。
最後の一文は少し訳がおかしいので、原文(英語)を上げておきます。
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/set_1
> Numeric values are decimal numbers unless prefixed by 0× for hexadecimal numbers or 0 for octal numbers. Therefore, 0×12 is the same as 18, which is the same as 022.
以下、私訳です。
「数値は、16進数の場合は先頭に0x, 8進数の場合は0が付かない限りは10進数として扱われます。したがって、文字列"0x12"(16進数表記)と"022"(8進数表記)"は10進数の18と同じ値です。」
ご見解ありがとうございます、
やはり 自分の変数の分け方では 文字列として 個々の変数に値が収まらない ってことだけは理解できたので、Melissa36Dさんの提案に従い for文を使った方式を 現在試行中です。
これはこれで 色々と壁にぶつかっています。オプションの指定の仕方が悪いのか
"tokuns=1-3 delims=/" の使い方が 誤っているとかいうエラーがでているのが 現況です。
ほんと 苦手医師があります、バッチ・コマンドは
> for文を使った方式を 現在試行中です。
set /a を使う限り、8月("08")と9月("09")の日付はエラーになります。(8進数としては処理できない文字列だからです)
> Melissa36Dさんの提案に従い
Melissa36D 氏の他の回答を見ると判ると思いますが、ChatGPTなどのLLMアプリケーションによって生成された回答です。また、以下の回答の様に質問とは無関係なリンク(URL)を混入させている場合がありますのでご注意下さい。
Shopifyで独自アプリを開発する方法
https://teratail.com/questions/u0ot80870s6uf5#reply-3q5t5sh6k2hmdo
melianさんが 04/24 14:27 にご提示頂いている内容を ようやく解釈して 手元のコーディングにあてはめて 問題なく 目的が達成できました。
最初から正解を頂いていたのに、迷走を続けてしまい大変失礼しました。
あ...しまった~本式(業務活用用)のバッチファイルに ご見解を適合しようとして気が付きました。
自分の当初手立てが 変数内部の日付をわざわざ 年・月・日に 分解する過程をへたうえで 0除去の日付体裁を作り出そうとしていたか 今更ながら思い出しました。
一連は 内閣府提供の 祝祭日一覧のCSVに 当該日が含まれているか否かの 判定を バッチファイル内で行ううえでの 手続きでした
このCSVファイル内の 存在有無確認だけでは 年末年始が 正常日になってしまうから 1231 0102 0103 も祝祭日の扱いにするために 月日4バイトを 内部で得る必要があったから 分割過程を含めていたんです、私。 掲載タイトル・問合せ主旨と かけ離れてきており 申し訳ありません
現況は ご提案の方式で、CSVファイルの存在チェックには 使える日付書式に 体裁を整えることができたのですが、年末・3が日かの 判定ロジックの上では 分解が やはり 必要な状況で
やはり どうすれば 10進数としての 分割を 達成できるのだろうか というのが 相変わらず 謎の状況です。 一応 正直に 現状を報告させて頂きました。

回答2件
あなたの回答
tips
プレビュー