【.cmd】 バッチファイルスクリプト %15 【.bat】 (760レス)
上下前次1-新
1(1): デフォルトの名無しさん [sage] 2022/09/14(水) 20:04:01.36 ID:XL8H98jz(1) AAS
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです
※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう
過去スレ
%14 2chスレ:tech
%13 2chスレ:tech
%12 2chスレ:tech
%11 2chスレ:tech
%10 2chスレ:tech
%9 2chスレ:tech
%8 2chスレ:tech
%7 2chスレ:tech
%6 2chスレ:tech
%5 2chスレ:tech
%4 2chスレ:tech
%3 2chスレ:tech
%2 2chスレ:tech
【.cmd】 バッチファイルスクリプト %1 【.bat】
2chスレ:tech
バッチファイルプログラミング 3.bat
2chスレ:tech
バッチファイルプログラミング 2.bat
2chスレ:tech
バッチファイルプログラミング質問スレ
2chスレ:tech
2(1): デフォルトの名無しさん [] 2022/09/16(金) 00:28:41.18 ID:9kvq1ahn(1/3) AAS
助けてください。
変数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(1): デフォルトの名無しさん [] 2022/09/16(金) 00:29:57.20 ID:9kvq1ahn(2/3) AAS
FOR /f "tokens=1,2,3 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)
の間違いでした。だれか助けて〜
4(1): デフォルトの名無しさん [sage] 2022/09/16(金) 00:32:46.68 ID:/mniU0r8(1) AAS
for /?
for /f
(ファイル)
("文字列")
('コマンド')
5(1): デフォルトの名無しさん [] 2022/09/16(金) 00:42:16.15 ID:9kvq1ahn(3/3) AAS
>>4
ありがとうございます!
神!
6: デフォルトの名無しさん [] 2022/09/25(日) 20:41:32.40 ID:0LVDTkG9(1) AAS
set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=%hoge1%+%hoge2%
echo %hoge3%
hoge3のところには単に「+」と表示され、
echoのところにはなにも表示されず、
その次に「オペラントがありません」と表示されます。
これはなにが起こっているのでしょうか…
7(1): デフォルトの名無しさん [sage] 2022/09/26(月) 00:15:07.76 ID:7oxCYWvG(1/2) AAS
if とか for のブロックの中?
外部リンク:otnx.jp
8: デフォルトの名無しさん [] 2022/09/26(月) 00:46:39.21 ID:ou4YDIZU(1/3) AAS
>>7
御明察です!理由が分かって安心しました。ありがとうございます。
forループの中で、このような処理を書くことはできないのでしょうか。毎回ランダムで少し変えて実行する、という処理を書きたいのですが…
9(1): デフォルトの名無しさん [sage] 2022/09/26(月) 01:01:52.99 ID:3mhNpNjH(1/2) AAS
for文の展開で解釈が一回多く入るから1回目の解釈後も環境変数として残すようにする
%%hoge%% → %hoge% → 環境変数hogeの中身に置換
上の方法はトリッキーなので正規には遅延環境変数展開を使う(setlocal /?)
setlocal EnableDelayedExpansion
10(1): デフォルトの名無しさん [] 2022/09/26(月) 01:47:37.41 ID:ou4YDIZU(2/3) AAS
>>9
ありがとうございます!できました!
setlocal enabledelayedexpansion
forループの初め
set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=!hoge1!+!hoge2!
echo !hoge3!
forループの終わり
という風にしたら、動きました。
デフォルトではforループ全体が一気に読み込まれるので、変数への代入が実行される前に変数の内容が確定してしまうという仕様なんですね。それを回避するために、!を付けて展開遅延変数を用いる、ということですね。
ただ、ランダムにしたはずなのに、毎回同じ値が表示されますね…
何故…
11(1): デフォルトの名無しさん [sage] 2022/09/26(月) 01:54:43.87 ID:yGyQXERn(1) AAS
%random%
じゃなくて
!random!
12: デフォルトの名無しさん [sage] 2022/09/26(月) 05:19:01.77 ID:L5dyrqoL(1/2) AAS
そういえば、181系って、完全に揃った編成ってあったんだろうか?
台車違いの編入車や、485系仕様の編入車・新製車とかで、
いつも凸凹でちぐはぐだったイメージしかない
もし、153系の前面が165系の塗りになったら
足回りとか見慣れた目にはやっぱり違和感あるんだろうなぁ
クハ164は塗装変更しないで正解だったと思うわ
13: デフォルトの名無しさん [sage] 2022/09/26(月) 05:19:38.74 ID:L5dyrqoL(2/2) AAS
誤爆失礼!
14(1): デフォルトの名無しさん [sage] 2022/09/26(月) 11:49:53.74 ID:7oxCYWvG(2/2) AAS
>>10
set /a hoge1=!random!, hoge2=!random!, hoge3=hoge1+hoge2
set /a は , 区切りで複数の式を指定可
環境変数は展開せずとも計算可能。その場合存在しない変数名は0として扱われ、展開した場合(多くはエラーになる)とは違ってくるので意図した計算になっていない事に気付き難い事に注意が必要
random などの特殊環境変数は環境変数としては存在せず、展開時に代入されるので展開が必要
setlocal enabledelayedexpansion
for /L %%i in (1,1,4) do (
set /a a=!random!, b=!random!, c=a+b
echo !c!
)
pause
こんな風にも書ける
set /a c=(a=!random!)+(b=!random!)
echo !a! + !b! = !c!
「遅延環境変数」という名称はそういう変数が別にあるのかと紛らわしくて良く無いと思うわ
環境変数
特殊変数
標準展開、事前展開、%展開 (展開されてから構文解析)
遅延展開、!展開 (構文解析されてからコマンド実行直前に展開)
用いるなら「環境変数の遅延展開」だろう
15: デフォルトの名無しさん [sage] 2022/09/26(月) 12:58:23.71 ID:3mhNpNjH(2/2) AAS
英語だと
delayed expansion
delayed variable expansion
説明文的には
Enables the delayed environment variable expansion
Setting EnabledDelayedExpansion will cause each variable to be expanded at execution time rather than at parse time
16(2): デフォルトの名無しさん [sage] 2022/09/26(月) 17:38:32.28 ID:dNpEj5o9(1) AAS
set /a a=random
は0なんやな
一般変数と処理が違うんだ
17: デフォルトの名無しさん [] 2022/09/26(月) 21:36:40.64 ID:ou4YDIZU(3/3) AAS
>>11
>>14
ありがとうございます。
うまく動きました!
18: デフォルトの名無しさん [sage] 2022/09/28(水) 11:14:01.39 ID:RG22wEyx(1) AAS
>>16
> 一般変数と処理が違うんだ
違わない
set a=
set random=
set /a b=a, c=random
echo %b%, %c%, %random% #set /a では環境変数として定義されていない文字列は0として扱われる
set a=1
set random=1
set /a b=a, c=random
echo %b%, %c%, %random% #特殊変数は環境変数として定義されると環境変数が優先され特殊変数としては機能しなくなる
set random=
echo %random% #環境変数を削除すれば元通り
pause
19: デフォルトの名無しさん [sage] 2022/09/28(水) 12:04:21.93 ID:Cg5haYXb(1) AAS
>>16
set /a a=%random%
20: デフォルトの名無しさん [sage] 2022/09/29(木) 13:35:46.81 ID:ezl+1hvw(1) AAS
確かに違わないんだけど、どう違わないのか勝手に補足。
set /?に基づくここでの用語定義:
・「環境変数」(一般変数)
… 値が一旦決まれば勝手には値が変わらない普通の環境変数。Windowsの機能がベース。
・「動的な環境変数」(dynamic environment variables)(特殊変数)
…「RANDOM」「ERRORLEVEL」など。cmdの独自機能。
仕様仮定(私の認識):
・set /a での名前だけで値を参照できる機能は「環境変数」だけ対象としている。
・cmdの構文解釈による「%〜%」で値を参照できる機能は
「環境変数」と「動的な環境変数」を対象としている。
以上を踏まえたうえで
「set /a a=random」の「random」は「動的な環境変数」ではなく「環境変数」であり、
『他の「環境変数」の扱い』と「違わない」。
「一般変数と処理が違う」のはcmdによる構文解釈の「%〜%」での扱い。
また、「set /a a=%random%」での「%random%」は
まずcmdの構文解釈により「動的な環境変数」として「123」のように展開され
「set /a a=123」となり、setには「環境変数」すら使われていないように見える。
※cmdの内部コマンドである「set」からは「動的な環境変数」も見えてもいいのにね。
同じく内部コマンドの「if」からは見えてるみたいだし。
21: デフォルトの名無しさん [] 2022/10/05(水) 15:17:30.50 ID:NmGDxxah(1/2) AAS
質問です。
ファイルのフルパスを表示するときに、
このコマンド使っていますよ、という意味で
rem %0
echo %0
と買いているんですが、remの方の変数まで展開されてしまいます。
展開させずに文字列のまま表示するにはどうしたらよいでしょうか?
22(1): デフォルトの名無しさん [sage] 2022/10/05(水) 15:28:26.09 ID:yuT90fin(1) AAS
rem %%0
23: デフォルトの名無しさん [] 2022/10/05(水) 16:34:14.38 ID:NmGDxxah(2/2) AAS
>>22
出来ました!ありがとうございます。
24: デフォルトの名無しさん [] 2022/10/08(土) 17:33:40.37 ID:zk6uj/6h(1/2) AAS
C:\test>"C:\test\app.exe"
というコマンドを間違えて実行したらapp.exeが0バイトに書き変わったのですがなぜでしょうか
25: デフォルトの名無しさん [sage] 2022/10/08(土) 17:43:53.04 ID:f2a8Snt9(1/2) AAS
空の標準出力をリダイレクトで書き込んでるからだろう
上下前次1-新書関写板覧索設栞歴
あと 735 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.394s*