【.cmd】 バッチファイルスクリプト %15 【.bat】

2022/09/14(水) 20:04:01.36ID:XL8H98jz
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう

過去スレ
%14 https://mevius.5ch.net/test/read.cgi/tech/1597442426/
%13 https://mevius.2ch.net/test/read.cgi/tech/1542779527/
%12 https://mevius.2ch.net/test/read.cgi/tech/1489207631/
%11 https://echo.2ch.net/test/read.cgi/tech/1424858999/
%10 https://peace.2ch.net/test/read.cgi/tech/1374205515/
%9 https://toro.2ch.net/test/read.cgi/tech/1335015478/
%8 https://toro.2ch.net/test/read.cgi/tech/1315844420/
%7 https://hibari.2ch.net/test/read.cgi/tech/1298873550/
%6 https://hibari.2ch.net/test/read.cgi/tech/1277465356/
%5 https://pc12.2ch.net/test/read.cgi/tech/1242268171/
%4 https://pc12.2ch.net/test/read.cgi/tech/1229955189/
%3 https://pc11.2ch.net/test/read.cgi/tech/1217860043/
%2 https://pc11.2ch.net/test/read.cgi/tech/1197881068/
【.cmd】 バッチファイルスクリプト %1 【.bat】
https://pc11.2ch.net/test/read.cgi/tech/1178281991/
バッチファイルプログラミング 3.bat
https://pc11.2ch.net/test/read.cgi/tech/1148485555/
バッチファイルプログラミング 2.bat
https://pc8.2ch.net/test/read.cgi/tech/1104911889/
バッチファイルプログラミング質問スレ
https://pc5.2ch.net/test/read.cgi/tech/1040614686/
2デフォルトの名無しさん
垢版 |
2022/09/16(金) 00:28:41.18ID:9kvq1ahn
助けてください。
変数HOGEをキー入力してsplit()的な区切り文字列で分割する挙動を取りたいのですが
なぜかファイルが見つかりませんとなります。
リテラルでSET HOGE=1,2,3と記述していれば希望の動作となります。
半日困って今日は会社にお泊りです。誰か教えてください。

REM キー入力でHOGEに"1,2,3"と入力する
SET /P HOGE=

FOR /f "tokens=1,2 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)

OUTPUT ファイル 0_0 がみつかりません。
3デフォルトの名無しさん
垢版 |
2022/09/16(金) 00:29:57.20ID:9kvq1ahn
FOR /f "tokens=1,2,3 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)
の間違いでした。だれか助けて〜
2022/09/16(金) 00:32:46.68ID:/mniU0r8
for /?

for /f
(ファイル)
("文字列")
('コマンド')
5デフォルトの名無しさん
垢版 |
2022/09/16(金) 00:42:16.15ID:9kvq1ahn
>>4
ありがとうございます!
神!
6デフォルトの名無しさん
垢版 |
2022/09/25(日) 20:41:32.40ID:0LVDTkG9
set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=%hoge1%+%hoge2%

echo %hoge3%

hoge3のところには単に「+」と表示され、
echoのところにはなにも表示されず、
その次に「オペラントがありません」と表示されます。

これはなにが起こっているのでしょうか…
2022/09/26(月) 00:15:07.76ID:7oxCYWvG
if とか for のブロックの中?
https://otnx.jp/CMD/?%C1%B4%C8%CC/%B9%BD%CA%B8%B2%F2%C0%CF
8デフォルトの名無しさん
垢版 |
2022/09/26(月) 00:46:39.21ID:ou4YDIZU
>>7
御明察です!理由が分かって安心しました。ありがとうございます。

forループの中で、このような処理を書くことはできないのでしょうか。毎回ランダムで少し変えて実行する、という処理を書きたいのですが…
2022/09/26(月) 01:01:52.99ID:3mhNpNjH
for文の展開で解釈が一回多く入るから1回目の解釈後も環境変数として残すようにする
%%hoge%% → %hoge% → 環境変数hogeの中身に置換

上の方法はトリッキーなので正規には遅延環境変数展開を使う(setlocal /?)
setlocal EnableDelayedExpansion
10デフォルトの名無しさん
垢版 |
2022/09/26(月) 01:47:37.41ID:ou4YDIZU
>>9
ありがとうございます!できました!

setlocal enabledelayedexpansion
forループの初め

set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=!hoge1!+!hoge2!

echo !hoge3!
forループの終わり


という風にしたら、動きました。
デフォルトではforループ全体が一気に読み込まれるので、変数への代入が実行される前に変数の内容が確定してしまうという仕様なんですね。それを回避するために、!を付けて展開遅延変数を用いる、ということですね。

ただ、ランダムにしたはずなのに、毎回同じ値が表示されますね…
何故…
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況