【.cmd】 バッチファイルスクリプト %10 【.bat】at TECH
【.cmd】 バッチファイルスクリプト %10 【.bat】 - 暇つぶし2ch62:デフォルトの名無しさん
13/08/28 23:25:21.40
Javaみたいなコンパイルに失敗したらecho %errorlevel%で1って出力されるような言語で

わざとエラーがでるコードTest.javaを用意して
batファイルに
javac Test.java
echo %errorlevel%
って書いてコマンドプロンプトから実行しても%errorlevel%が表示されません
batファイルを実行した後に、手入力でecho %errorlevel%て打つと1って表示されます
どうやってbatファイルからエラーレベルを出力できますか?

63:デフォルトの名無しさん
13/08/29 01:13:42.16
うそでしょう

64:デフォルトの名無しさん
13/08/29 03:12:21.55
echo %erorlevel%
とか

65:デフォルトの名無しさん
13/08/29 04:34:12.99
>>62
javacって使ったことないけど復帰値として値を帰さずに環境変数にセットしてるのか
まあ、そういう場合の俺の知識じゃ良い解決策はない
続きは別のbatプログラムにして、当batではタスク登録して終了し、後はタスクにその別のbatを起動してもらう方法ぐらいかな
(bat中から新たに子プロセスcmd.exeを起動しても引き継ぐ環境はそれを実行前の環境なのでダメだね)


c:\x.bat
----
javac Test.java
schtasks /create /tn test-java /sc onidle /i 1 /ru user-name /rp user-password /tr c:\y.bat
schtasks /run /tn test-java

c:\y.bat
-----
schtasks /delete /f /tn test-java
続きの処理を記述

66:デフォルトの名無しさん
13/08/29 04:48:47.80
>>65
呼び出し元プロセスの環境変数は普通変えれんぞ。
というかタスク作ってしまったら何も情報伝わらないし、その方法意味あるんか?

なんとなく、
~(
javac Test.java
echo %errorlevel%
)
ってなってるとか、Typoがあるとか、そういうのの方が怪しい気がする。
一番確実な対処はIF ERRORLEVEL 1とかの擬似環境変数ではない組み込み機能使って判定する方法だと思う。

67:デフォルトの名無しさん
13/08/29 05:07:02.44
>>66
寝ぼけてたね
確かに意味が無いな
これはインストーラなどでPATH環境変数が変化した場合に有効な手段だった

68:67
13/08/29 05:39:08.45
寝ぼけてたけど、間違ったのは
動作確認のために、コントロールパネルのシステムからユーザー環境変数を追加設定してやってたため

この場合環境変数の設定値が反映されるにはcmd.exeを起動しなおさないと反映されないので

69:デフォルトの名無しさん
13/08/29 09:13:27.67
>>68
なるほど・・・現在の環境ではなくユーザの環境を読ませる一手間か
start /Iもatもユーザの環境を読み直さないし、runasはスマートカードかパスワード入力が必要になってしまうんだな
タスクはrunasと同等だし環境読み直すのも理解できるけど、エクスプローラからcmd起動したときとかはどういう挙動してんだろうコレ?

70:デフォルトの名無しさん
13/08/29 10:16:28.24
すいませんsetlocal EnableDelayedExpansionで取得できました
いまいちどうして取れたかわかりませんが

71:デフォルトの名無しさん
13/08/29 11:50:48.02
今時なぜコマンドプロンプトなんですか?
powerShellを使わない理由はなぜでしょうか?

72:デフォルトの名無しさん
13/08/29 13:11:42.03
>>71
コマンドプロンプトで足りるような用途にまで
PowerShellを使わなきゃならん理由は何だ?
まさか、自慢話を始めようとしてるのではないだろうな?

73:デフォルトの名無しさん
13/08/29 17:17:49.98
>>70
うそでしょう

74:デフォルトの名無しさん
13/08/29 22:54:22.66
>>73
66で指摘されてるようなやり方してたんじゃね。
「すいませんsetlocal EnableDelayedExpansion(して、%errorlevel%を!errorlevel!にしたら)で取得できました」
だと普通によくあるミス。

75:デフォルトの名無しさん
13/08/29 23:46:04.67
>>74
すいません書き忘れてました
そづえす%から!にも書き換えてます

76:デフォルトの名無しさん
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