【.cmd】 バッチファイルスクリプト %10 【.bat】at TECH
【.cmd】 バッチファイルスクリプト %10 【.bat】 - 暇つぶし2ch76:デフォルトの名無しさん
13/08/30 00:18:49.86
findstrで実行結果にファイル名を出さない方法はありますでしょうか?

findstr "あああ" "C:\test.txt"

とファイルを完全に指定すれば実行結果は

あああいいい
いあああいい
いいあああい

のようになって、ファイル名は出ずに一致した行の内容だけが表示されます。
しかし

findstr "あああ" "C:\*.txt"

のようにワイルドカード指定にすると実行結果には

C:\test.txt: あああいいい
C:\test.txt: いあああいい
C:\test.txt: いいあああい

のように一致した行の内容だけでなく、その行が含まれているファイル名まで表示されてしまいます。
これをファイル名は出さないように出来ないでしょうか?

77:デフォルトの名無しさん
13/08/30 00:37:21.63
for %i in ("C:\*.txt") do @findstr "あああ" "%i"

78:デフォルトの名無しさん
13/08/30 01:04:42.61
>>76
forfiles /?

79:デフォルトの名無しさん
13/08/30 02:12:22.49
>>70
%~%はその文字列を含むコマンドの実行前に展開されます。
何らかの書き方が原因で、javacの実行からエラーレベル取得までが1つ(1行)のコマンドとして解釈されてしまったのでしょう。
()で括るとかもその一つ。&で繋ぐのもそれに含まれるっけ?

80:デフォルトの名無しさん
13/08/30 15:31:41.07
type "C:\*.txt" | findstr "あああ"

81:デフォルトの名無しさん
13/08/30 16:01:29.88
call echo %%errorlevel%%

82:76
13/08/30 22:05:42.92
>>77>>80
ありがとうございます!
どちらでも出来そうですね。
来週会社で試してみますね。

83:76
13/08/31 08:34:39.52
>>78
すみません、見落としてました。
このコマンドは知りませんでした。

forfiles /m "C:\*.txt" | findstr "あああ"

とすれば処理できそうですね。
ただPCがWinXPなのでこのコマンド自体がありません…
でも勉強になりました。

84:デフォルトの名無しさん
13/09/01 10:52:35.80
findstrで一文字違いまで検索結果に含めたい時スマートな記述無いでしょうか?
「いちごぱんつ」を検索して「いちのぱんつ」とか「いちごぱんだ」とかも同時に拾いたいのです

85:デフォルトの名無しさん
13/09/01 11:53:35.40
ない

いちごぱんつ
*ちごぱんつ
い?ごぱんつ
いち?ぱんつ
いちご?んつ
いちごぱ?つ
いちごぱん*

86:デフォルトの名無しさん
13/09/01 12:01:14.09
findstrは複数文字列のOR検索するのに、
パイプを使わない表記方法(二重引用符で囲んでスペース区切り)
があるのがUNIX系のgrepコマンドより便利だよね

87:デフォルトの名無しさん
13/09/01 23:14:25.16
おお、それでOR検索してくれるのか
一行で済むならおkですありがとう

88:デフォルトの名無しさん
13/09/07 21:02:07.49
echo %test%

89:デフォルトの名無しさん
13/09/07 21:44:23.13
>>85
> *ちごぱんつ
これ正規表現として構文エラーだろw
まあこれに限らずどれも正規表現じゃなくてワイルドカードとして記述してるみたいだが
findstrじゃワイルドカードは使えないだろwww

90:デフォルトの名無しさん
13/09/08 13:50:51.90
dir /s /b "C:\windows" >> ".\a.txt"

で更新中の.\a.txtを

findstr "hoge" ".\a.txt"

で検索してもエラーが起こることは絶対にないですよね?

91:デフォルトの名無しさん
13/09/08 14:41:10.54
command.comじゃないんだからw

92:デフォルトの名無しさん
13/09/08 18:48:49.51
forコマンドの/dオプションってどういう時に使うんだ?
↓の①は②のように書けば事足りると思うが?
/rオプションもいまいち使いどころがわからない。

①for /d %i in ("c:\temp\*") do @echo %i

②for /f %i in ('dir /s /b /ad c:\temp') do @echo %i

93:デフォルトの名無しさん
13/09/08 20:50:40.92
テキストファイルが1つあり、そのファイルの奇数行目の内容だけを表示することって可能でしょうか?

94:デフォルトの名無しさん
13/09/08 22:01:56.01
>>92
それいうとfor /Dに限らずforデフォルト動作もそうだし、
dir /Sは再帰だからfor /Dと動作違う気がするんだが、
まぁそれはそれとして置いとこう。
②の欠点
・単純にコマンドが長い
・パイプ動作なのでcmd /U環境でないとUnicode文字が使えない
・/Sだとフルパスで冗長だし/-Sだと相対パス的に美味しくない

>>93
可能だけど、処理が複雑化する予定があるなら別の言語を併用したほうが良い
エスケープ周りで破綻してから再移植とかくっそダルいよ

95:デフォルトの名無しさん
13/09/09 01:36:16.64
>>93
とりあえずどうやるのか興味もあるだろうから例示するが、
文字列操作は、制御文字等使えない文字が多々ありいろいろトラブルのでbatでやるのは俺もお勧めしない
@echo off
setlocal ENABLEDELAYEDEXPANSION
set z=0
for /f "tokens=*" %%i in (data.txt) do (
rem set /a z=^^!z
set /a z^^=-1
if !z! neq 0 echo.%%i
)
endlocal

なお遅延環境変数を使うと、さらに文字列データ所以のトラブルが増えるので
以下のようにサブルーチンにして回避することもできる(ここでデータをパラメタ渡しにするとトラブルが増える)
@echo off
set z=0
for /f "tokens=*" %%i in (data.txt) do set data=%%i & call :output
goto :eof
:output
if %z%==0 echo.%data%
set /a z=!z
goto :eof

96:デフォルトの名無しさん
13/09/09 15:54:39.20
>>92
for /r root %i in (.)


>>94
えらく詳しいのー感心感心

隠しはどうする?


>>95
空行はどうする?
find /n /v "" data.txt
で行番号を振って、奇数行だけ

97:デフォルトの名無しさん
13/09/09 16:22:43.22
>>96
すげぇ上から目線で重箱つついてるが、そんなんで人生大丈夫か?

>隠しはどうする?
隠しを列挙したいってケースより普通にfor /Dで済むケースのほうが多いから基本問題なし
そうしなきゃ駄目な時は諦めて、欠点を潰すか無視をしてfor /Fを使えばいい
一々全部の欠点例外を潰した万能定型文で…みたいな事はアホらしいからやりたくない
妥協が許されないならハナから汎用言語でも使っとかないと只の苦行だわ

>空行はどうする?
それも使えない文字の一例にすぎないだろ
行番号を消す処理も必要になるし、その手の対策の積み重ねも複雑化を招く

98:92
13/09/09 21:15:46.13
>>94-95
ご回答ありがとうございます。
なるほど、②は色々短所が目立ちますね。
実行速度も比較するのが馬鹿らしくなるほど①>>>>>>>>②でした。
ちなみに>>93も私ですw
これも前途多難な感じなので他の方法を考えます。
なんか話が高度になってきたのでこの辺で…

99:デフォルトの名無しさん
13/09/11 16:23:50.79
set の文字列置換で文字列中に含まれる=自体を置換(削除)したいのですがどうしたらよいでしょうか?

set a=abc=def
set a=%a:==%

とやるとエラーになりますんで…

100:54
13/09/11 17:10:40.49
お、俺じゃないからね!

101:デフォルトの名無しさん
13/09/11 17:40:47.80
>>99
すまんが簡単な方法が分からん

set a=abc=def=ghi
set n=0
set new_a=
:loop
call set a1=%%a:~%n%,1%%
if "%a1%"=="" goto next
if "%a1%" neq "=" set new_a=%new_a%%a1%
set /a n+=1
goto loop
:next
set a=%new_a%

102:デフォルトの名無しさん
13/09/11 18:26:47.00
for /f "delims== tokens=1,2" %i in ("%a%") do set b=%i%j

103:101
13/09/11 19:21:16.50
>>99,100
wsh(jscript)とかを併用することを考えたら?
使い捨てじゃなく将来複雑な処理が考えられるのなら後々楽になるよ

以下のはbatに埋め込んだ形になってるがxxx.jsと別ファイルにしてxxx.batから呼び出す方がいいだろう
@if (0)==(0) echo off
cscript //nologo /e:jscript "%~f0" <test.txt >result.txt
type result.txt
goto :eof
@end
/*
WScript.Echo(WScript.StdIn.ReadAll().replace(/=/g,""));
*/
var stdin=WScript.StdIn;
while(!stdin.AtEndOfStream) {
var data=stdin.ReadLine().replace(/=/g,"");
// var data=stdin.ReadLine().replace(/(.+?)=(.+)/,"$2=$1"); //>>100さん対応 a=bをb=aに入替
WScript.StdOut.WriteLine(data);
}

104:デフォルトの名無しさん
13/09/12 22:31:25.95
通りすがりだが>>102のでバッチリできたぞ?
これ>>54にも使えるんじゃね?

105:デフォルトの名無しさん
13/09/12 23:23:43.17
>>104
取り敢えずそれで良いとしても、EOL指定とか空行とか非置換行とかメタ文字とか…
最終的には別言語併用出来るようにしたほうが楽な可能性があるって事は留意しておいても良いと思う。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch