【.cmd】 バッチファイルスクリプト %10 【.bat】at TECH
【.cmd】 バッチファイルスクリプト %10 【.bat】 - 暇つぶし2ch1:デフォルトの名無しさん
13/07/19 12:45:15.17
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %9 【.bat】
スレリンク(tech板)

それ以前の過去スレ
%8  スレリンク(tech板)
%7  スレリンク(tech板)
%6  スレリンク(tech板)
%5  スレリンク(tech板)
%4  スレリンク(tech板)
%3  スレリンク(tech板)
%2  スレリンク(tech板)
%1  スレリンク(tech板)

2:デフォルトの名無しさん
13/07/19 13:58:16.64
うんちっち

3:デフォルトの名無しさん
13/07/19 20:09:20.20
@echo ^>^>1乙

4:デフォルトの名無しさん
13/07/20 14:17:08.00
wshもここでええのんか?

5:デフォルトの名無しさん
13/07/20 15:58:37.65
お前ら、wsh使ってますか? Part8

6:デフォルトの名無しさん
13/07/21 19:30:14.12
C:\Users\user\desktop
の時にdesktopだけを表示したいのですがよい方法はありませんか

7:デフォルトの名無しさん
13/07/22 23:17:08.85
「set /p hizuke=日付を入力して下さい:」
とやると
「日付を入力して下さい:」
と出ますが、この時に
「日付を入力して下さい:2013/07/22」
のように今日の日付をデフォルト値として表示出来ないでしょうか?
思いつきで
「set /p hizuke=日付を入力して下さい:<echo %date%」
とかやってみましたがもちろんダメでした…

8:デフォルトの名無しさん
13/07/23 00:10:32.95
set /p hizuke="日付を入力して下さい:%date%"

9:デフォルトの名無しさん
13/07/23 00:17:29.12
空入力でデフォルト値
set hizuke=%date%
set /p hizuke=日付を入力して下さい:%hizuke%

10:7
13/07/23 01:10:42.24
ありがとうございます。
ただ言い忘れていましたが、表示したデフォルト値をキーボードで変更できるようにしたいのです。
例えば2013/07/22と表示されたら最後の2を消して5にしたりといった具合にです。

11:デフォルトの名無しさん
13/07/23 22:36:55.04
schtasksで長いタスク名を確認する方法はありますでしょうか?
例えば

schtasks /create /tn "メモ帳を起動してやるぞ!こんちくしょう!" /tr c:\windows\system32\notepad.exe /sc daily /st 23:00:00

と入力して「メモ帳を起動してやるぞ!こんちくしょう!」というタスク名のタスクを作成します。
すると、

schtasks /query

と入力して先ほど作ったタスクを表示させるとタスク名が途切れて表示されてしまいます。
これでは途切れていない正しいタスク名がわからず、タスクを削除する時などにタスク名を指定できません。
タスクスケジューラでもPowerShellでもいいので途切れていない正しいタスク名を確認する方法を
知っている方がいましたら教えて下さい。

12:デフォルトの名無しさん
13/07/24 17:34:48.71
ありません

13:デフォルトの名無しさん
13/07/24 18:25:09.85
>>11
へー最近はそんなことになってるんだねえ
XPだとタスク名は欠けることなく全部出る
何かオプションスイッチがあるんでないのかなあ
まあ回避手段としては、タスクの実体は(XPの場合だと)tasksフォルダ内のファイル(xxx.job)なんで直接ファイル名を漁るとかかな
for /f "tokens=* delims=" %%i in ('dir /b "%systemroot%\tasks\*.job"') do echo %%~ni

14:13
13/07/24 18:33:40.73
ヘルプ見たら
schtasks /query /fo list
または
schtasks /query /fo csv
で表示できるんでないかな

15:11
13/07/24 19:58:05.43
>>13-14
/foオプションで出せるんですね。知りませんでした…
"%systemroot%\tasks"フォルダに保存されるというのも初めて知りました。
これはこれで使い道が色々ありそうなので覚えておきます。
助かりました。どうもありがとうございます。

(実は家のPCはXP-Homeでschtasks無いので試すのは明日会社でですが…(笑))

16:デフォルトの名無しさん
13/07/24 22:11:11.93
3つの.exe ファイルが有るんですが、1つを実行するBATファイルを作りたいです
どうすればいいですか?

17:デフォルトの名無しさん
13/07/25 00:10:35.11
if

18:15
13/07/25 22:29:07.88
今日会社のPC(Win7)で/foオプション使ってうまくいきました。
しかしWin7だとタスクのファイルは"%systemroot%\system32\tasks"フォルダに作成されるようです。
OSの種類によってパスが変わるなんてめんどうな仕様ですよね…(泣)

19:デフォルトの名無しさん
13/07/26 07:44:45.38
仕様なんだからしようがない

20:デフォルトの名無しさん
13/07/26 18:01:38.77 BE:1441685344-2BP(0)
僕のpcにあるテキストファイルを全てusbにコピーしたいです。
すぐにコピーしてペーストすれば使えるbatのコマンドを教えてください!

21:デフォルトの名無しさん
13/07/26 18:24:42.29
@echo off
echo pcにあるテキストファイルを全てusbにコピーしました!!!
exit /b 0

22:デフォルトの名無しさん
13/07/26 20:15:51.22
ありがとう!

23:デフォルトの名無しさん
13/07/26 20:48:56.63
>>20
まず、ファイル名を列挙する
dir /s /b > deltext.bat
つぎに、ファイル名の前に、DELコマンドを付記して、バッチファイルに保存
バッチファイルを実行

バッチファイルの例
REM deltext.bat
DEL C:\work\05_06_07_08.txt
DEL C:\work\068.txt
DEL C:\work\099.txt
DEL C:\work\1.BAK
DEL C:\work\1.bat
DEL C:\work\1.ini
DEL C:\work\1.rb

24:デフォルトの名無しさん
13/07/26 20:51:53.63
>>20
テキストファイルかどうか、テキストエディタで開いてみないとわからない

25:デフォルトの名無しさん
13/07/26 20:56:13.36
>>23
DELコマンドじゃなくて、COPYコマンドだ。COPYコマンドなら、どこに送るかかかなければならない

26:デフォルトの名無しさん
13/07/26 20:57:20.88
もうねます

27:デフォルトの名無しさん
13/07/26 21:05:58.98
誤ってDELコマンドでファイルを削除した場合、
undeleteという英語版のソフトウェアで復旧できるかもしれない
どれがいいのかしらない

28:デフォルトの名無しさん
13/07/26 21:11:54.85
MOVEコマンドで、ひどいめにあったことがある。MOVEコマンドは、要注意

29:デフォルトの名無しさん
13/07/26 22:41:30.42
ワイルドカードの指定が短いファイル名の方にも効いてしまう問題って
Win7あたりで解消したんだっけ?

30:デフォルトの名無しさん
13/07/27 10:27:32.35 BE:4054739459-2BP(0)
ではpc内のデータをすべて削除する場合はどうしたら?

31:デフォルトの名無しさん
13/07/27 12:14:00.07
iso2bin.exe isoをbin 形式に変換するファイルを見つけたんですが
使い方は、
コマンドプロンプト → cd c:\場所 → iso2bin track03.bin track01.iso
コマンドプロンプを呼び出さず簡略化したいんですけどどうすればいいですか?
D&D しても無理みたいです・・・orz

32:デフォルトの名無しさん
13/07/27 13:12:17.75
バッチファイル経由でD&D する

33:デフォルトの名無しさん
13/07/28 16:46:39.69
>>29
仕様は解消したりしないよ
自分が短いファイル名を作るからだろ。自業自得ってもんだ。
作らなきゃいいんだよ。

34:17
13/07/28 17:02:49.22
ちょっと記述が間違ってたので一応訂正しときます。
Win7ではSchtasksで作成したタスクはファイルとして作成されないようです。
"%systemroot%\tasks"フォルダも
"%systemroot%\system32\tasks"フォルダも見ましたが自分が作成したタスクは見当たりません。
"dir /s/b C:\*.job"ってコマンド叩いても出てきません。
コマンドで"Schtasks /query"を叩くともちろん出てきます
そういう仕様に変わったのかな?まあ"Schtasks /query"で確認できるので困りませんが。

35:デフォルトの名無しさん
13/07/28 17:03:40.77
↑は>>17ではなく>>18でした。すみません。

36:デフォルトの名無しさん
13/07/28 17:14:02.95
forコマンドで文字列置換はできないのでしょうか?
下記の<望む結果>を得たいのですが
下のコマンドでも駄目でした。

for /f %i in ('type test.txt') do echo %i:*:=%


<test.txtの内容>
ID:100
名称:あああ
価格:5000
ID:200
名称:いいい
価格:8000

<望む結果>
100
あああ
5000
200
いいい
8000

37:デフォルトの名無しさん
13/07/28 21:24:17.98
for /f "delims=: tokens=2" %i in ('type test.txt') do echo %i

38:36
13/07/29 01:05:50.44
>>37
でけましたーーーっ!!
おありがとうございます!
このように書くのですね。
勘違いして遅延展開とかいうのを調べてました・・・(^_^;)

39:デフォルトの名無しさん
13/07/31 13:20:09.51
すみません。教えてください。

<apply.bat>

中身↓

@echo off
dism.exe /apply-image /image file:XXX.wim /index:1 /applydir:C:\

としておきます。
しかしこれだとバッチ内で指定するwimファイル名を決めうちにしないといけません。

コマンドプロンプトから

apply.bat Image1.wim

で実行すれば、バッチ内で指定されるファイル名がImage1.wimになり、

apply.bat Win7.wim

ならWin7.wimが展開されるようにしたいのですが、何か良い方法はないでしょうか?

40:デフォルトの名無しさん
13/07/31 13:52:52.02
ファイルを指定する所にこんなの
"file:%~1"

41:デフォルトの名無しさん
13/07/31 16:40:42.73
>>40
ありがとうございました!
おかげさまでうまく行きました!

42:デフォルトの名無しさん
13/07/31 16:59:45.16
>>41
いいってことよ

43:デフォルトの名無しさん
13/08/04 15:02:32.34
バッチファイルから文字列をエコーしてファイルに流し込んで
スクリプトを作成・実行ということをしているのですが、
リダイレクト先のファイル行頭にスペースができてしまいます。

echo;>%~n0.vbs Set fso = CreateObject("Scripting.FileSystemObject")
echo;>>%~n0.vbs Set regEx = New RegExp
echo;>>%~n0.vbs Set inFile = fso.OpenTextFile("%CD%\%~n0.txt")
中略
cscript //nologo %~n0.vbs
と%~n0.vbsへ流し込むと、以下のように先頭にスペースが空きます。

□Set fso = CreateObject("Scripting.FileSystemObject")
□Set regEx = New RegExp
□Set inFile = fso.OpenTextFile("C:\home\work\20130804-145429\test.txt")
↑このスペース(□で表記)をなくしたいのです。
実用上は問題ありませんが、回避が可能であればご教示願いたいです。
お分かりの方居りましたらよろしくお願いいたします。

44:デフォルトの名無しさん
13/08/04 15:13:20.70
echo Set fso = CreateObject("Scripting.FileSystemObject")>%~n0.vbs
echo Set regEx = New RegExp>>%~n0.vbs
echo Set inFile = fso.OpenTextFile("%CD%\%~n0.txt")>>%~n0.vbs

こう?
というか、そんな書き方できたんだ……

45:デフォルトの名無しさん
13/08/04 15:38:17.83
>>44さんできました!
echo;Set regEx = New RegExp>>%~n0.vbs
として解決しました。ありがとうございます。

リダイレクト方法はいくつかあるようですね。
本来ならカッコで囲んでひとまとめにするがシンプルなのでしょう。
(
echo;ほげ
echo;ほげ
)>"%~n0.txt

この方法は今回はバッチの前後の関係から制約があるため、このような方法でやってました。
お答えいただきまして、素早い対応ありがとうございました。

46:43
13/08/04 16:40:57.42
>>44さんへ
質問時に書き込んだ方法ですが、まるっきりの自己流だったようです。
参考にしたサイトを見直してみたら、全然違ってました。昔の記憶をたよりに適当に書いてたようです。
混乱させてすみませんでした。

ちなみにこのサイトです。
「全般/ファイルディスクリプタとリダイレクト - CMD.EXE TIPs」
URLが長いので上のキーワードで検索してください。有名どころですが一応。では失礼します。

47:デフォルトの名無しさん
13/08/04 19:34:25.18
>>44
> というか、そんな書き方できたんだ……
俺も知らんかった…

で、試しにこうやってみると一応これでも行頭のスペースはなくなるな

echo>%~n0.vbs Set fso = CreateObject("Scripting.FileSystemObject")
echo>>%~n0.vbs Set regEx = New RegExp
echo>>%~n0.vbs Set inFile = fso.OpenTextFile("%CD%\%~n0.txt")

つまり>>44はechoの直後にセミコロンとスペースが続いてからSetがあるように
解釈されてリダイレクトされてたんだろう

48:デフォルトの名無しさん
13/08/04 19:35:40.05
> つまり>>44はechoの直後にセミコロンとスペースが続いてからSetがあるように
>>43と間違えた

49:デフォルトの名無しさん
13/08/04 19:46:45.63
echo.>hoge.txt とか echo;>hoge.txt
ってやったら空改行が出力されるのと同じ原理なのかな

50:デフォルトの名無しさん
13/08/04 20:27:29.78
>%~n0.vbs echo;Set fso = CreateObject("Scripting.FileSystemObject")
だな

51:デフォルトの名無しさん
13/08/04 22:59:08.63
いつからかコマンドプロンプトで日本語が■■■って表示されるようになっちゃったんですけど
どうやって直せばいいんですか?
ググって出てくるコードページを変えたりフォントを変えるのを試しても戻りませんでした
XPです

52:デフォルトの名無しさん
13/08/05 04:37:36.99
>>51
cmd.exeを再インストールするか諦めてCygwinとか使えばいいんじゃ?
後はWin再インスコ

53:デフォルトの名無しさん
13/08/05 04:54:05.79
>>51
レジストリ
HKEY_CURRENT_USER\Console
を削除してみろ
念のためバックアップしてからね

54:デフォルトの名無しさん
13/08/18 10:50:05.72
= を含む文字列を = を含む文字列で置換するのに良い方法無いでしょうか?
事前にIF使った総当りで入れ替えておく方法は何とかできたのですが
下記の記述方で使えそうなエスケープなどあればと思いまして。


:: A=B を B=A に置換
set test=%test:A=B=B=A%

55:デフォルトの名無しさん
13/08/18 13:55:19.72
>>53
遅くなりましたが
この方法で復活しました
ありがとうございました!

56:デフォルトの名無しさん
13/08/18 20:22:21.99
BをCに蛙
AをBに蛙
CをAに蛙

57:デフォルトの名無しさん
13/08/18 20:31:28.88
>>56
つまり、ループ内で遅延展開を用いた入れ替えをやれってことっすね!

>>54
vbsでregexpしちゃいなよ

58:デフォルトの名無しさん
13/08/19 02:53:58.72
頭が遅延してんの?

59:デフォルトの名無しさん
13/08/19 06:00:05.97
>>56-57
レスどうもです、やっぱ無理ですかぁ

60:デフォルトの名無しさん
13/08/19 06:25:29.73
power shellの話ははどこで話せばよいの?
ざっと見たけどスレがないみたいなんだけど…

61:デフォルトの名無しさん
13/08/19 21:50:14.01
Windows PowerShell Part4

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