【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net

1デフォルトの名無しさん 転載ダメ©2ch.net2017/03/11(土) 13:47:11.66ID:2LSSeyH1
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %11 【.bat】©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1424858999/

それ以前の過去スレ
%10 http://peace.2ch.net/test/read.cgi/tech/1374205515/
%9  http://toro.2ch.net/test/read.cgi/tech/1335015478/
%8  http://toro.2ch.net/test/read.cgi/tech/1315844420/
%7  http://hibari.2ch.net/test/read.cgi/tech/1298873550/
%6  http://hibari.2ch.net/test/read.cgi/tech/1277465356/
%5  http://pc12.2ch.net/test/read.cgi/tech/1242268171/
%4  http://pc12.2ch.net/test/read.cgi/tech/1229955189/
%3  http://pc11.2ch.net/test/read.cgi/tech/1217860043/
%2  http://pc12.2ch.net/test/read.cgi/tech/1197881068/
%1  http://pc11.2ch.net/test/read.cgi/tech/1178281991/

848デフォルトの名無しさん2018/10/05(金) 17:27:41.95ID:vSWfZutq
setlocal enabledelayedexpansion
set /a a=0
for /L %%i in (1,1,3) do ( set /a a=%%i &set /a b=a &set /a c=!a! &set /a d=%a% &echo !a! !b! !c! !d! )
なら

1 1 1 0
2 2 2 0
3 3 3 0

となる。
bへの値代入が!抜きのaでできるって知らなかったわ…
謎挙動。

849デフォルトの名無しさん2018/10/05(金) 18:09:57.00ID:Iu01kfl1
set /a で %a% や !a! はあまり使用しない方が良さそうだ
% や ! は演算子に含まれる文字で紛らわしいし
展開のタイミングで予想外の挙動するし
展開時に >>844 のように特異値でエラーになったりするし

値参照は変数名だけでいい

850デフォルトの名無しさん2018/10/05(金) 18:17:00.44ID:vSWfZutq
ご自由に。それより某グラマー御用達QAサイトのトップ回答者様が書くバッチがgoto :EOF 多用で頭痛い

851デフォルトの名無しさん2018/10/05(金) 18:26:50.86ID:Iu01kfl1
俺もよく使うよ、goto :eof

852デフォルトの名無しさん2018/10/05(金) 18:28:05.47ID:hOPHqLcn
>>850
何か問題が?
goto :endとかより遥かにいいと思うが

853デフォルトの名無しさん2018/10/05(金) 18:33:02.62ID:Iu01kfl1
goto その物が多いとか言われた事も

854デフォルトの名無しさん2018/10/05(金) 18:46:17.97ID:vSWfZutq
自分だと大抵

{メインルーチン}
goto :EOF

:sub1
{サブルーチン12}
exit /b

:sub2
{サブルーチン}
exit /b

と書くことが多い。

トップ回答者様は

{メインルーチン}
goto :EOF

:sub1
{サブルーチン}
goto :EOF

sub2
{サブルーチン}
goto :EOF

と回答されている。サブルーチンの下のはgoto は不要だし慣れない。

855デフォルトの名無しさん2018/10/05(金) 19:02:53.79ID:Iu01kfl1
戻り値なけりゃどっちでもいい様な気がするが
逆に exit を避けてる人もいるよ

856デフォルトの名無しさん2018/10/05(金) 19:53:21.88ID:LaGwhHU8
俺もgoto派だな

857デフォルトの名無しさん2018/10/05(金) 21:35:58.50ID:RB/KKRkK
gotoは見通しが悪くなるから、極力使わないようにしてる
他の主流の言語だと使えないものが多いから、必然的にそういう書き方に慣れてしまった

858デフォルトの名無しさん2018/10/05(金) 23:49:53.55ID:8nMQUHh9
goto は使わないに越したことはない。
が、制御構文が貧弱な言語では、熟慮の上で使わざるを得ない場面で使う。
が正解。

詳しくはWikipediaで。

859デフォルトの名無しさん2018/10/05(金) 23:56:24.52ID:qkvvR9Zs
Cでもgotoは使うよね

860デフォルトの名無しさん2018/10/05(金) 23:58:44.47ID:8nMQUHh9
C言語にはMISRAとかいう規約があるが無視していい。
あれは組み込み分野だけの特殊なものだと思っていい。

大抵の人間は、「これは思考からはぶいていい」という書き方の方が読みやすい。
だから、「これは戻すか終わらせる」と書いていっていい。
そうすれば、残ったものに集中できるだろ?

まぁ、日ごろ「自分が辞めた後にこれを読まされる人間が困らないかどうか」って考えて書いてるかどうかってことだ。

861デフォルトの名無しさん2018/10/06(土) 16:39:29.59ID:P4YKYACU
あちこちでreturnするのもスパゲッティなgotoと大差がない気がするんだ
テロ的というか

862デフォルトの名無しさん2018/10/06(土) 17:10:22.17ID:GNiE4xH/
字面が違うだけで同じだろ

863デフォルトの名無しさん2018/10/06(土) 20:28:48.17ID:gea8Zy97
gotoもイディオムに従って使えば混乱しない
バッチファイルだとforの方が理解不能で害悪

864デフォルトの名無しさん2018/10/06(土) 23:02:20.58ID:tgEP6apu
gotoがゴーゴーに見えた

865デフォルトの名無しさん2018/10/06(土) 23:12:15.45ID:uJ87E9Rb
>>860-861
IPAの出してるMISRAの解説書のreturnは1か所にしろというルール、
あれはクソofクソのルールだと思うね。early returnこそ正義

Cとbatの書き方は全然比較にならないけど

866デフォルトの名無しさん2018/10/07(日) 00:27:12.50ID:pbh8RIqN
>>861
むしろ goto の良い使い方と言われている制限が、return をまねたもの。

867デフォルトの名無しさん2018/10/07(日) 11:03:03.39ID:Bzp9uIq0
バッチファイルかパワーシェルでIPv4のIPアドレスのみを取得して環境変数に代入するにはどういうコマンドになりますか?
教えてください

868デフォルトの名無しさん2018/10/07(日) 12:00:15.70ID:6qmhFN/2
「powershell ip address」で検索!

869デフォルトの名無しさん2018/10/07(日) 12:28:26.52ID:VwaVbKnV
>>867
環境変数IPAddressに192を含んだIPアドレスを代入するサンプル(PowerShell 2.0併用)

set CMD=powershell -command "& {ipconfig |? {$_ -match 'IP.*: 192\.'}|% {$_ -replace '.*: (\d+\.\d+\.\d+\.\d+)','$1'}}"
for /f "usebackq delims=" %%a in (`%CMD%`) do set IPAddress=%%a
echo %IPAddress%

PowerShell部分はipconfigの結果から正規表現でIPと: 192という文字を含む行を抽出
抽出した行のIPアドレス部分のみ正規表現の置換で抽出といった感じ
PowerShell3.0以降だともうちょっと素直に書ける感じだけど

870デフォルトの名無しさん2018/10/07(日) 12:53:16.71ID:Dedwpgqn
アダプタが1つだけならこんなでいいんじゃね?

setlocal enabledelayedexpansion
for /f "tokens=2 delims=:" %%a in ('ipconfig ^|find "IPv4"') do set IPADRESS=%%a
set IPADRESS=%IPADRESS:~1%
echo %IPADRESS%

871デフォルトの名無しさん2018/10/07(日) 12:54:26.67ID:Bzp9uIq0
この処理作るのにバッチとパワーシェル組み合わせないとできないんですか?
ip取得するだけでも結構大変なのですね

872デフォルトの名無しさん2018/10/07(日) 12:56:55.73ID:Bzp9uIq0
と思ったらバッチだけでもできそうなんですね、アダプターは一つです
ちょっと色々教えてもらったのでテストしてみます!

8738702018/10/07(日) 13:03:20.66ID:Dedwpgqn
遅延変数展開の呪文要らなかったわ、1行目削っていいよ

874デフォルトの名無しさん2018/10/07(日) 13:07:01.74ID:Bzp9uIq0
遅延環境数ってforとifの()で使用するときだけ必要なんでしたっけ?

875デフォルトの名無しさん2018/10/07(日) 13:23:02.79ID:Dedwpgqn
だいたいその理解でおk
forやifの()内のスクリプトブロックが複数処理で変数代入とその参照のペアがある場合に使う
1処理だけとか、代入だけとかなら不要

876デフォルトの名無しさん2018/10/07(日) 17:41:47.85ID:0jrGYEp4
無限ループの原因は何か
SET A=1073741824
FOR /L %%B IN (-%A%,%A%,%A%) DO ECHO %%B

877デフォルトの名無しさん2018/10/07(日) 19:04:07.20ID:Dedwpgqn
set /a A=1073741824
1073741824
set /a B=A+A
-2147483648
となるからね、32bitINTの範囲が-2147483648〜-2147483647
2進表記の最上位bitが1が立ってしまったらマイナス値

878デフォルトの名無しさん2018/10/07(日) 19:25:23.31ID:Dedwpgqn
試してみるとfor /l 文ではステップ値が1073741824以上の場合必ずバグったループになるね、まあ仕方ないのかも

879デフォルトの名無しさん2018/10/07(日) 19:43:19.94ID:0jrGYEp4
内部的にどんな計算してるか気になるところです
B は -1073741824,0,1073741824 なので
普通に考えると32ビットのオーバーフローはしてない筈

880デフォルトの名無しさん2018/10/07(日) 19:55:29.49ID:0jrGYEp4
ああ、分かった
4ループめでオーバーフローするのか
3ループめで最終値に等しいと抜けるんじゃ無いわけか

881デフォルトの名無しさん2018/10/07(日) 19:57:49.70ID:2JwzOMBB
バッチファイルのif文でパワーシェルのif -Orみたいな処理できますか?

882デフォルトの名無しさん2018/10/07(日) 20:18:06.07ID:0jrGYEp4
IFの条件は2個の値を比較するだけ
複雑なOR,AND,XORとかあるんなら計算して結果を変数に入れる
それをIFの条件で使う

883デフォルトの名無しさん2018/10/08(月) 21:58:47.76ID:To7x1PVP
あると便利なミニミニバッチ

DOS窓に今の時間を表示しておく
m.bat
@echo off
setlocal
set x=%date:~5% %time:~0,5% %*
title=%x%
exit /B 0

画面クリア
c.bat
@echo off
cls
exit /B 0

クリップボードクリア
cc.bat
@echo off
echo.|clip
echo clip clear
exit /B 0

884デフォルトの名無しさん2018/10/09(火) 08:38:25.31ID:IIAdkwpd
画面クリアは普通にcls打つのと何が違うん?

885デフォルトの名無しさん2018/10/09(火) 11:35:59.50ID:9WevvN1n
時刻表示ならプロンプト変えたら?
clsは>>884
クリップボード履歴管理系のアプリ使ってる人には無用?

886デフォルトの名無しさん2018/10/09(火) 15:53:20.49ID:hXgFZ2lj
>>884
一文字でいいので、お菓子を食べながらでもできる、大差

887デフォルトの名無しさん2018/10/10(水) 17:37:49.95ID:Wl83IH5q
そういうしょぼいものならdoskeyでも使っとけ

888デフォルトの名無しさん2018/10/11(木) 22:01:20.44ID:aIIKUaH8
1文字とか何かで誤爆しそうで危うすぎる

889デフォルトの名無しさん2018/10/12(金) 00:17:12.22ID:xVyRtSc0
くだらねー

890デフォルトの名無しさん2018/10/13(土) 05:37:42.36ID:YmkYzRio
copyコマンドがおかしい
copy x+y z
とするとzに改行追加されている

copy /B x+y z
だと問題なしだが??

891デフォルトの名無しさん2018/10/13(土) 07:34:07.12ID:TS7U3WRI
>>890これね
ttp://shigechi-64.hatenablog.com/entry/20090717/1247798200

892デフォルトの名無しさん2018/10/13(土) 19:25:44.82ID:fQqIQRVk
改行じゃなくて 0x1A の 1byte なら付加されるが

echo test> a
dir a
copy a /b + nul /a
dir a

サイズが 1byte 増える

893デフォルトの名無しさん2018/10/14(日) 01:22:10.62ID:IWBgfNe4
>>891
以前から知られていたのですね

そのサイトはウィルス注意報が出たので見ませんでしたが

894デフォルトの名無しさん2018/10/14(日) 06:32:47.46ID:5zXkQKrC
テキストファイルのEOF(0x1A)は前世紀の遺物
昔のテキストエディタはファイルの末尾にEOF(0x1A)を付加していた。
仕様が古すぎて今じゃCOPYのヘルプを見ても、詳細が分からん状態

copy でファイルを連結する時は /a がデフォルト
ちなみに copy /a はEOF(0x1A)を付加するだけじゃないぞ
ファイルの途中に0x1Aが有ったらそれ以降が無くなってしまう怖い仕様

あと、echo xxx >> とかでテキストを追加したら末尾の0x1Aは勝手に削除される

895デフォルトの名無しさん2018/10/14(日) 09:07:44.01ID:YBMQaeBO
>>30
>>31
ずいぶん昔の質問で悪いんだが
これって全ての引数を意味する「%*」に起動時のコマンドラインは含まれないってこと?

896デフォルトの名無しさん2018/10/14(日) 18:08:37.67ID:gwXaIkcp
chcp 65001入ってるスクリプトをUTF-8で保存して動かしてみたらエスケープ処理が酷い・・・

897デフォルトの名無しさん2018/10/15(月) 01:28:48.04ID:yVBNeV/e
>>895
そうです
バッチはいろいろ癖があるので、そんなものだと思うしかないです

別件
echo %*
shift
echo %*

rem %* はshiftされない

898デフォルトの名無しさん2018/10/16(火) 00:24:50.38ID:GeydM3gl

新着レスの表示
レスを投稿する