テキストファイルから、2つの値をインターバルを設けて取得するバッチファイルを書きました。
また、プログラム作成にあたり生成AIの助力を得ました
テキストファイル(input.txt)
aaa 111
bbb 222
ccc 333
ここが 最終行
上記のテキストファイルでやりたかったこと
- テキストファイルのスペースで区切った2つの値を取り出す
- 複数行の場合なるべくランダムな値でインターバルを設けたのち実行
- 最後の行はインターバルなし
aaa 111
bbb 222
ccc 333
ここが 最終行
↓
aaa と 111 を取得
インターバル
bbb と 222 を取得
インターバル
ccc と 333を取得
インターバル
ここが と 最終行 を取得
インターバルなしで終了
たとえば、APIリクエストをランダム化して送信したりダウンロードタスクの管理を想定してしています。
文字コードと改行コード
はじめに、バッチファイルや外部ファイルに日本語が含まれる場合を考慮して、バッチファイル、外部ファイルともに以下の文字コードで保存します。
- Windooswのメモ帳だったら文字コード「ANSI」で保存。
- 他のテキストエディターの場合、選択できれば文字コード「shift-JIS」で保存。
また、Windooswのメモ帳で作成した場合、改行コードはCR+LF
になりますが、他のテキストエディターの場合は明示的に改行コードCR+LF
で保存します。
バッチファイル初心者から黒魔術師になろう #Windows - Qiita
バッチファイル
最終行の判定は文字列で判定するものと、行番号で判定するものを作成しました。
参照するファイル名はinput.txtの部分です。適宜変更してください。
最終行を文字列で判定
@echo off
setlocal enabledelayedexpansion
set "filename=input.txt"
set "lastLine="
for /f "usebackq delims=" %%i in ("%filename%") do (
set "lastLine=%%i"
)
for /f "usebackq tokens=1*" %%a in ("%filename%") do (
if "%%a %b" == "!lastLine!" (
echo This is the last line: %%a %%b
) else (
echo Not the last line: %%a %%b
set /a seconds=!random! %% 10 + 1
timeout /t !seconds! /nobreak
)
)
pause
最終行を行番号で判定
@echo off
setlocal enabledelayedexpansion
set lastLineNum=0
for /f "usebackq tokens=1*" %%a in ("input.txt") do (
set /a lastLineNum+=1
set "value-1!lastLineNum!=%%a"
set "value-2!lastLineNum!=%%b"
)
for /L %%i in (1,1,%lastLineNum%) do (
if %%i == %lastLineNum% (
echo !value-1%%i! !value-2%%i!
) else (
echo !value-1%%i! !value-2%%i!
set /a seconds=!random! %% 10 + 1
timeout /t !seconds! /nobreak
)
)
pause
csvファイルなどカンマ区切りの場合
csv例(input.csv)
Value1-1,Value1-2
Value2-1,Value2-2
Value3-1,Value3-2
この部分に↓
usebackq tokens=1*
delims=,
を追加(tokens=1,2
に変更してもOK)
usebackq delims=, tokens=1,2
次に、
if "%%a %b"
を
if "%%a,%b"
に変更
今後のためのメモ
バッチファイル作成全般:バッチファイル初心者から黒魔術師になろう #Windows - Qiita
@echo off
コマンドラインを見やすくするため: バッチファイルによく出てくる@echo offの意味 #Windows - Qiita
setlocal
他の場所の環境変数に影響を与えない:setlocal - Windowsコマンド虎の巻
enabledelayedexpansion
(書くときはsetlocal EnableDelayedExpansion
)遅延環境変数とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
[Windows] バッチのfor文で変数を遅延展開する | 晴耕雨読
for
繰り返し処理:.bat(バッチファイル)のforコマンド解説。 #Windows - Qiita
/f
ファイル解析を使用して、コマンド出力、文字列、およびファイルの内容を処理:[バッチ] for と 「/f "tokens=〇"」 を使って、スペース区切りの文字列の必要列だけ取り出す #Windows - Qiita
usebackq
読み込むファイル名に空白が含まれる場合INの中のファイル名をダブルクォーテーションで囲う必要があり、その時使うオプション:コマンドプロンプト | テキストファイルの内容を区切り文字でトークンに分解し繰り返し処理を使う(FOR)
*
トークンに * を指定すると、その先全部を取得(2番目の値(文字列や数字)にスペースがある場合を想定):意外と知られていないけど、知っていると便利な FOR コマンド - Windows 徹底解説 - Web/DB プログラミング徹底解説
%% 10 + 1
バッチファイルの乱数生成と注意点(じゃんけんゲーム) | うまてくブログ
モジュロ演算とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
インターバルが0秒の可能性があったので採用を見送りましたがset /a seconds=!random!*11/32767
で0から10のランダムな数を生成できる:バッチファイルで乱数を扱う方法 | 技術的特異点
timeout/ t
、nobreak
、nobreak
は途中でユーザーのキー操作による中断をさせず、必ず最後までカウントダウンさせる:【Windows 11対応】Windowsの「timeout」「sleep」コマンドでバッチファイルの実行を一時停止する:Tech TIPS - @IT
for /L
始め、間隔、終了の値を指定して繰り返し処理:コマンドプロンプト | バッチファイルで繰り返し処理を使う(FOR)
その他
コメントなし:
コメントを投稿