今時こんなん使うんかシリーズ

色々調べてそれなりの形にできたものの、飽き始めて日の目を見なさそうなので供養します。
正直今になってがっつり処理組み込むようなbat作るとかあるんか???とは思いますが、どうなんでしょう…。
私の好みというか、書き方の癖が大いに反映されているのでそこはご了承ください。

備忘録の方にも載せた私の好きな例の記事ではボロクソ言われてますが、個人的には面白くて楽しいです。
どうすれば思い通りに動くのか、悩むのは嫌いじゃないです。
ハイクソーってなることも大いにありますし、好き好んで使うかどうかは別として。
これらがこの機に及んで誰かの参考になるのであれば嬉しい限り。

動確環境はこれ。
Microsoft Windows [Version 10.0.19044.1766]
1月~12月までの何かしらがあるか確認

月に拘らず、連番とか一定条件の増減とか決まった数であれば流用できると思います。
setlocalの外に配列もどきを置いてるのは他で使ってた名残です。
(endlocalを抜ければ紐づくsetlocalを踏む前の状態に戻るので、初期化という名のずぼら)
元は12ヶ月分のフォルダがあるかファイル名で確認したくて作ったもの。
個数でいいなら全部カウントして-2か、1文字目がドットでなければカウントみたいな処理になるんですかね。
と言うかwhere使ったらいいのかな。

@echo off
for /l %%i in (1,1,12) do (
  set G_ARRAY_MONTH[%%i]=
)

setlocal enabledelayedexpansion
for /d %%a in (対象パス) do (
  rem 何かしらの手段で何月分か確認
  set month=(対象月)
  set G_ARRAY_MONTH[!month!]=*
)
for /l %%i in (1,1,12) do (
  if "!G_ARRAY_MONTH[%%i]!" == "" (
  echo %%i月がありません。
  )
)
pause
endlocal enabledelayedexpansion
exit /b
和暦年を取得

備忘録のやり方よりちょっとマシになりました。
mmdd形式ならこっちがいいと思いますが、md形式とかだったら備忘録のやり方がいいかも知れません。
備忘録に書いてたかもしれませんが、batの制限内で可変時の桁数チェックが面倒なんですね。
下手とも言いますが。

@echo off
setlocal
set JPYear=%date:/=%
set /a JPYear=%JPYear% - 20180000
set JPYear=%JPYear:~0,-4%
echo %JPYear%
pause
endlocal
exit /b
10個以上の引数渡し

1つの変数にカンマ区切りでログを追加し、最後にまとめて出力しようとしたやつ。
画面出力とは別にログ出力を任意にしたかったのでまとめましたが、都度出した方がいいんですかね。
他言語でもこんな数渡すことない気がします。

@echo off
setlocal
set text=(カンマ区切りの対象文字列)
call :output %text%
pause
endlocal
exit /b

:output
setlocal enabledelayedexpansion
  set line=
  set /a cnt=1

  :loop
  call set line=%%%cnt%%
  if not "%line%" == "" (
    echo !line!
    if !cnt! lss 9 (
      set /a cnt+=1
    ) else (
      shift
    )
    goto :loop
  )
endlocal enabledelayedexpansion
exit /b
文字列から数値部分を取得

例えば令和4年6月とか、123a45bc6.txtみたいな文字と数値の混合から数値だけ欲しかったり。
不変であれば桁数指定で抜き取ればいいんですが、可変だとそうもいかないので、作ったはいいもののイケてません。
他言語で言う、対象文字をcastしてcatchに入ったら数値以外、みたいな手法なので結構強引です。
窮余。

@echo off
setlocal enabledelayedexpansion
set line=(対象文字列)
set str=

:loop
if not "%line%"=="" (
  set str=!line:~0,1!
  set /a num=!str!
  if !str! == !num! (
    (数値のときの処理)
  ) else (
    (数値じゃないときの処理)
  )
  set line=!line:~1!
  goto :loop
)
pause
endlocal enabledelayedexpansion
exit /b

完全余談ですが、「苦肉の策」って言葉があるじゃないですか。
苦し紛れとか悩んだ末の手段、みたいなニュアンスで記憶してたので、「苦肉」だけでも似たような意味を持ってると思ってたら違いました。
「苦肉」の紹介と言うか解説サイトに載っていた「窮余」が欲しい意味合いに当てはまったので、本記事ではこちらを使っています。
社会人になってつくづく思いますが、一番難しいのはプログラムのあれやこれでなく日本語だと思うんですね…。

参考
Qiita
バッチファイルでの試行錯誤を回避するためのメモ-または人類には早すぎた言語
SetLocal EnableDelayedExpansionの罠とその回避方法
私の好きな例の記事(1個目)と同じ作者さんの違う記事(2個目)

JapanKnowledge
「苦肉(くにく)」はどこの肉が苦しいのか?

投稿者: motalenemy

切り絵とゲームを気まぐれで作る仮面ライダー好きな馬骨

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。