質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

450閲覧

バッチファイル内で、スラッシュ付きの日付文字列から、前ゼロを除去しようとしています

saya24

総合スコア258

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2025/04/24 03:44

編集2025/04/26 00:36

実現したいこと

引数を与えられた場合は その引数のスラッシュ付き日付を、
引数を与えられない場合は 当日を内部でえて
最終的には 標題の目的を達成しようとしています。(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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2025/04/24 05:27

"/0" を "/"に置換すればよいかと思います。 set CHECK_DATE=2025/04/01 set FORMATED=%CHECK_DATE:/0=/% echo %FORMATED% 2025/4/1
saya24

2025/04/24 11:26

ご見解ありがとうございます、現況以下のように変更して 一応に 期待結果を得られるようになりました。=をまたいで 左辺右辺の間にスペースが入っている・いないだけで挙動が変わってしまうのでしょうかね。。。
melian

2025/04/24 11:31

> 左辺右辺の間にスペースが入っている・いないだけで挙動が変わってしまうのでしょうかね。。。 はい、スペースを含む文字列として処理されますので、例えば %CHECK_DATE:/0 = /% とする場合には "/0 " を " /" に置換することになります。なので、文字列 2025/04/01 は置換されずにそのままになります。
melian

2025/04/26 03:41 編集

> 引数に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と同じ値です。」
saya24

2025/04/26 09:50

ご見解ありがとうございます、 やはり 自分の変数の分け方では 文字列として 個々の変数に値が収まらない ってことだけは理解できたので、Melissa36Dさんの提案に従い for文を使った方式を 現在試行中です。 これはこれで 色々と壁にぶつかっています。オプションの指定の仕方が悪いのか "tokuns=1-3 delims=/"  の使い方が 誤っているとかいうエラーがでているのが 現況です。 ほんと 苦手医師があります、バッチ・コマンドは 
melian

2025/04/26 10:08 編集

> for文を使った方式を 現在試行中です。 set /a を使う限り、8月("08")と9月("09")の日付はエラーになります。(8進数としては処理できない文字列だからです) > Melissa36Dさんの提案に従い Melissa36D 氏の他の回答を見ると判ると思いますが、ChatGPTなどのLLMアプリケーションによって生成された回答です。また、以下の回答の様に質問とは無関係なリンク(URL)を混入させている場合がありますのでご注意下さい。 Shopifyで独自アプリを開発する方法 https://teratail.com/questions/u0ot80870s6uf5#reply-3q5t5sh6k2hmdo
saya24

2025/04/26 10:55

melianさんが 04/24 14:27 にご提示頂いている内容を ようやく解釈して 手元のコーディングにあてはめて 問題なく 目的が達成できました。 最初から正解を頂いていたのに、迷走を続けてしまい大変失礼しました。
saya24

2025/04/26 11:19

あ...しまった~本式(業務活用用)のバッチファイルに ご見解を適合しようとして気が付きました。 自分の当初手立てが 変数内部の日付をわざわざ 年・月・日に 分解する過程をへたうえで 0除去の日付体裁を作り出そうとしていたか 今更ながら思い出しました。 一連は 内閣府提供の 祝祭日一覧のCSVに 当該日が含まれているか否かの 判定を バッチファイル内で行ううえでの 手続きでした このCSVファイル内の 存在有無確認だけでは 年末年始が 正常日になってしまうから 1231 0102 0103 も祝祭日の扱いにするために 月日4バイトを 内部で得る必要があったから 分割過程を含めていたんです、私。 掲載タイトル・問合せ主旨と かけ離れてきており 申し訳ありません  現況は ご提案の方式で、CSVファイルの存在チェックには 使える日付書式に 体裁を整えることができたのですが、年末・3が日かの 判定ロジックの上では 分解が やはり 必要な状況で やはり どうすれば 10進数としての 分割を 達成できるのだろうか というのが 相変わらず 謎の状況です。 一応 正直に 現状を報告させて頂きました。
guest

回答2

0

自己解決

ようやく 自分のやりたいことができました。
(/を含む日付文字列から 月・日の前ゼロ除去、それと 月日の数字4バイトの文字列形成・・・年末年始判定用)
一重にmelianさんのおかげです。本当はmelianさんをベストアンサーにしたかったくらいです。
ありがとうございました。

@echo off if "%1"=="" ( set CHECK_DATE=%date% ) else ( set CHECK_DATE=%1 ) rem ============================================== rem 日付書式の正規化 rem ============================================== set TODAY_FORMATED=%CHECK_DATE:/0=/% set yyyy=%CHECK_DATE:~0,4% set mm=%CHECK_DATE:~5,2% set dd=%CHECK_DATE:~8,2% echo %yyyy% echo %mm% echo %dd% set mmdd=%mm%%dd%https://teratail.com/code-of-conduct echo %mmdd% exit /b 0

投稿2025/04/27 23:37

saya24

総合スコア258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご提示のバッチファイルでは、スラッシュの代入ミスと数値演算コンテキストでの文字列結合が問題です。修正版では、set sl=/ でスラッシュを正しく代入し、文字列結合には /a なしの set を使用します。日付の取得と分割には for /f を用い、月と日の先頭の 0 を削除してからスラッシュで結合します。引数なしで実行すると当日、引数ありで実行するとその日付が "YYYY/M/D" 形式で表示されます。

投稿2025/04/24 08:08

Melissa36D

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saya24

2025/04/24 11:23

アドバイス 誠にありがとうございます。 仰られている内容すべてを 採用したわけではないのですが、以下のようにして 期待結果を得らえるようになりました。 これじゃまずいのかな??  for /f  の使い方がよくわからず @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 TODAY_FORMATED=%yyyy%%sl%%mm%%sl%%dd% echo %TODAY_FORMATED% exit /b 1
saya24

2025/04/26 00:38

補足部分に記載しましたが、 上記のコードのまま 8月の日付を指定した実行をすると、なぜか エラーになってしまうんです、こういったことだから for /f  を正しく使わないといけないんですかねぇ??
chome-x-chome

2025/04/29 04:23

set /a は数値計算用のオプションですが、08から始まる文字列等を代入しようとする場合に限り、内部的に8進数扱いにされます。正しい8進数でなければエラーを起こすのはレガシな負の遺産としてのコマンドプロンプトの仕様です。 提示されているバッチを拝見すると、/a を多用されていますが、日付時刻の各単位のような08が頻出する値を変数で扱う場合、可能な限り/a の使用は避け、「set m=%mm:0=%」のように、一旦文字列として0フィル解除処理を検討し、/aオプションは四則演算時に限定されるのが良いでしょう。 しかし、どうしても/aを使用する必要がある場合は、苦肉の策に近い手法ですが、「set /a m=2%mm%-200」のように%mm%の前に適当な数字(例の場合だと文字列08の前に2)を付与して08から始まらないよう数値として置き換え、200を引くことで、環境変数mに求めたい数値8の代入を実現することができます。 どのような手法を選択するにせよ、/aオプションと日付時刻の相性が最悪なのは変わりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問