[過去ログ] 【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
628
(1): 626 2018/07/15(日)10:00 ID:LqRrN2Y+(2/3) AAS
>>627
コードといっても何も特別なことはしてないんだけど、何十行というのは嘘で
当該箇所確認してみたら実際には何百行もありました。

----- sample1.bat
echo [%time%] 開始
type nul > "D:\tmp\out-file.txt"
echo hoge>> "D:\tmp\out-file.txt"
echo hoge>> "D:\tmp\out-file.txt"
   〜延々と600行近い繰り返し〜
echo hoge>> "D:\tmp\out-file.txt"
echo hoge>> "D:\tmp\out-file.txt"
echo [%time%] 終了
exit /b
-----

これで大体3〜4秒くらい。実際のコードは文字列も長いし、
途中条件式が入ってたりするのでもうあと1〜2秒ほど長い。

前の投稿で「forで回してリダイレクトした方が何故か早い」と書き込んだけど、勘違い。
改めて確認したらほとんど変わらなかった。
629
(2): 626 2018/07/15(日)10:01 ID:LqRrN2Y+(3/3) AAS
>>627

----- sample2.bat
echo [%time%] 開始
type nul > "D:\tmp\out-file.txt"
for /f "usebackq delims=" %%L in (`findstr /n .* "D:\tmp\hoge-source.txt"`) do (
set str_temp=%%L
call :redirect-loop
)
echo [%time%] 終了
exit /b
:redirect-loop
echo %str_temp%>> "D:\tmp\out-file.txt"
exit /b
-----

教えてもらった全体を()で囲ってまとめてリダイレクトしたら一瞬で処理完了しました。ありがとうございます。
実際のコードは条件式の他に変数展開した文字列の中に()が含まれていたりするので、要所要所で使い分けが必要そうですが。
630: 2018/07/15(日)11:22 ID:SEkGxxwq(1) AAS
へー(´・∀・`)
631: 627 2018/07/15(日)12:40 ID:3kOM020K(2/2) AAS
>>628-629
あー、600行もあったらファイルのオープン・クローズ処理の影響が大きくなるねぇ。
カッコで括ると「括った内容、1行で延々書かれたものとして処理」してくれる。多分こういう用途のためにあるんだと思う。
なのでカッコ内の特殊文字エスケープは通常と変わらなかったはず…。(確証はないけど)

俺はヒアドキュメントっぽいことがしたい時、いちいちリダイレクトを入れるのが面倒&読みづらいこともあってこう書いてるわ。
632: 2018/07/18(水)10:40 ID:w8OpeSfX(1) AAS
>>629
別のバッチファイルにするのは駄目なん?
call b.bat >file
なら()の処理とか不要では。
633: 2018/07/18(水)21:57 ID:6GF3Pq4/(1/2) AAS
別のバッチファイルにする必要も無いんじゃね?

@echo off

call :abc > d.txt
goto :eof

:abc
echo xxx
echo yyy
echo zzz
634: 2018/07/18(水)22:23 ID:pnNaFbbR(1/4) AAS
それもいいんじゃない?
635
(2): 2018/07/18(水)22:31 ID:pnNaFbbR(2/4) AAS
ちょっと聞きたいんだが…

for /f "tokens=1* delims=:" %%A in ('findstr /n "^" filename.txt') do echo.%%B
これ、バッチが標準入力から受け取ったものを処理する雛形らしいんだけど…

findstr /n "^"
これアリか?正規表現として成立してない!?何だこれ??

findstr /n ".*"
ならアリだしこう書くべし。正規表現として何でもマッチする。

なんだけど何で findstr /n "^" が通るのか分からんわ。
636
(1): 2018/07/18(水)22:46 ID:6GF3Pq4/(2/2) AAS
それ、確か : で始まる行が不味いんじゃね?
637
(1): 2018/07/18(水)23:08 ID:apOKL4Dj(1) AAS
>>635
findstrはあくまで検索パターンにマッチする行全体を返す。
行頭文字があればマッチと判断するんだな、たぶん"$"でも通るんじゃね?w
638: 2018/07/18(水)23:17 ID:pnNaFbbR(3/4) AAS
>>636
外部リンク[html]:blogs.yahoo.co.jp
が上手いことやってる。感心した。万能ではないらしいが検証中。
tee が作れるかもしれん。

>>637
マジだった。findstrはアホの子だった。
639: 2018/07/18(水)23:20 ID:pnNaFbbR(4/4) AAS
あー、もっとも、find /v "" が空文字列にマッチする時点で駄目ではある。
640: 2018/07/18(水)23:47 ID:Ppp31GO+(1) AAS
このスレは勉強になる
641
(1): 2018/07/19(木)00:47 ID:oVpGn6oR(1) AAS
>>635
正規表現としてじゃなくて cmd のエスケープかと。

echo;abc | findstr /n ""
FINDSTR: 検索文字列がありません。

echo;abc | findstr /n "^"
1:abc
642: 2018/07/19(木)06:16 ID:hT+uAClu(1) AAS
>>641
^ の左側に " があるので ^ はただの文字
643
(4): 2018/07/19(木)08:15 ID:31+wDFSY(1) AAS
プロセスが特定の文字列を出力したら処理を終了させたくて下記のようなの書いてみたけど思うように動かないです。

process.exe | find "hoge"&&TASKkill /F /im process.exe

&&で指定したコマンドは元のプロセスが終了しないと実行されないのでしょうか?
644
(1): 2018/07/19(木)08:26 ID:HqFtoS+0(1) AAS
>>643
多分、process.exeが終了しなくても、標準入出力をクローズすればパイプは渡ってくるんじゃないかな?
645: 2018/07/19(木)22:23 ID:I1yUatr2(1) AAS
>>643
リファレンス読めよ。
&&を何かに変えれば多分動くぜ。
646: 2018/07/20(金)01:23 ID:FDkJiEQ5(1) AAS
コマンドプロンプトって、論理和使えないんだっけな
647: 2018/07/20(金)02:06 ID:2iB3qPvx(1/2) AAS
& コマンドの連結
&& 前のコマンドの実行結果が正常(ERRORCODE=0の場合)に後ろのコマンドを実行する
|| 前のコマンドの実行結果が失敗(ERRORCODE>0の場合)に後ろのコマンドを実行する
648: 2018/07/20(金)02:28 ID:2iB3qPvx(2/2) AAS
ERRORLEVELだったよ
あと、環境変数は実行前に展開されるため、前のコマンドで設定した値を後ろのコマンドで参照すると思わぬ結果になる
for文での注意と同様で、遅延環境変数を使うとかすれば大丈夫だが
また行を分ける場合に%errorlevel%を使うなら参照だけにすること
(設定すると単なる環境変数として扱われる)
あと、そもそも前のコマンドが終了してないのにパイプにデータが渡ってくるのかも要確認
649
(1): 643 2018/07/20(金)04:26 ID:ukKUYn/2(1) AAS
レスありがとうございます
標準入出力をクローズというのがちょっと分からないんですがどのようにすればいいのでしょうか?
650
(1): 2018/07/20(金)06:55 ID:gIwkChrm(1) AAS
process.exe に標準入出力をクローズさせるんだよ
651: 2018/07/22(日)19:18 ID:WPYgWuMH(1) AAS
そんなことするぐらいならvbsのExec使えばいいと思うの
652
(1): 2018/07/22(日)19:49 ID:Gp0M410Q(1) AAS
>>649
>>644 >>650 の言ってることは戯言だから気にするな。
process.exe が終了したら勝手にクローズする。
653: 2018/07/22(日)20:27 ID:jf6K150S(1) AAS
終了してから TASKkill しても見つからんエラーが出るだけで無意味
654: 643 2018/07/22(日)20:27 ID:oUJ4s6M9(1) AAS
リダイレクトしてテキストファイルに出力しながらstartで立ち上げた別のbatにfindして貰う事で解決しました。
655: 2018/07/22(日)23:35 ID:FoHjHQaV(1) AAS
>>652
process.exeってのが自作の場合、そうしろってことだろ
656
(1): 2018/07/23(月)17:41 ID:1W7qAEKf(1) AAS
Linuxでコマンド実行した結果とWindowsでコマンド実行した結果を
一つのファイルに書き出したいんだけど、改行コードが違っている
バッチファイルでCR LFではなくLFで出力したいなと思って
このコードを見つけたんだが何やってるのかさっぱりわからない

<NUL set /p=message が set /p=message <NUL と同じ意味で
「メッセージを表示してユーザーの入力内容を変数に入れるコマンド」の
代入先変数の省略 + 入力内容省略 = 改行なしecho
ということはわかったんだけど、^%LF%%LF% がなんなのか
なんでこれでうまく動くのかわからん

外部リンク:stackoverflow.com

SET LF=^

REM important to have two blank lines after the SET command
<NUL set /p=test line^%LF%%LF%> t.txt
657: 656 2018/07/24(火)01:43 ID:tpeQiESg(1/13) AAS
違うこと調べていて、たまたま答えにぶつかったぜw

外部リンク:kensou1900.blog96.fc2.com try-7.html
1-
あと 345 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.014s