1read 100read
2012年1月2期プログラム69: 【.cmd】 バッチファイルスクリプト %8 【.bat】 (460) TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
71: 雑談スレ 4 (214)
72: WindowsDDK各種についてのスレ (734)
73: 【関数化】ビット演算 0x03 (828)
74: お前ら何歳のときからプログラミングやってんの? (813)

【.cmd】 バッチファイルスクリプト %8 【.bat】


1 :11/09/13 〜 最終レス :12/01/26
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。
※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %7 【.bat】
http://hibari.2ch.net/test/read.cgi/tech/1298873550/
【.cmd】 バッチファイルスクリプト %6 【.bat】
http://hibari.2ch.net/test/read.cgi/tech/1277465356/
【.cmd】 バッチファイルスクリプト %5 【.bat】
http://pc12.2ch.net/test/read.cgi/tech/1242268171/
【.cmd】 バッチファイルスクリプト %4 【.bat】
http://pc12.2ch.net/test/read.cgi/tech/1229955189/
【.cmd】 バッチファイルスクリプト %3 【.bat】
http://pc11.2ch.net/test/read.cgi/tech/1217860043/
【.cmd】 バッチファイルスクリプト %2 【.bat】
http://pc12.2ch.net/test/read.cgi/tech/1197881068/
【.cmd】 バッチファイルスクリプト %1 【.bat】
http://pc11.2ch.net/test/read.cgi/tech/1178281991/

2 :
四十年勤め上げた會社を退職し早二十年、何やら張り合いの無い日々を送る内、大學生の孫に「退屈しのぎに遣って見たまへ」と勸められた弐チヤンネル。
當初は「こんな電腦掲示板、何たる幼稚加減」と莫迦にしてゐたものの、遣つて見ると存外に面白ひ。
華やかな色彩の髪と目を持つうら若き乙女に「ゆとり乙」と何度と無く罵られるにつけ、食ふや食はずやで慌しく過ぎ去つた學生時代が自ずと思ひ返され、「戰爭さえ無ければ、小生もこのやうな青春が送れたやも知れぬ」と獨りごちることも屡々。
すつかり虜となつた今では、孫の部屋から白銀色の電腦計算機をせしめては書齋に篭もり存分に「祭り」を堪能する毎日を送つている。
同年代の友人達が癡呆や重い病に惱まされるなか、老いて尚矍鑠としてオフ會に向かえるのも、ひとえに弐チヤンネルのおかげかと思えば、再三に渡る「半年ROMつてろ」の罵り文句も、何やら「まだまだ死ぬには早いよ」と言われているようで愉快極まりない。
ひとつ間違えれば自らが乗り込んでいた機體と同じ名前を持つコテハンに出會える日を樂しみにしつつ、今日もデスプレヱに向かう。
それでは、弐ゲツト。

3 :
>>1乙であります
forでのリネームについての質問なんですが、例えば
フォルダのみ先頭に()を付ける場合
for %%A in (*) do (
ren "%%A" "()""%%A"
)
と考えたんですが、bat自身だけが()追加でフォルダは何も変わりませんでした。
ren "%%~A" "()""%%~nA"
かと思ったんですが、これは「ファイル」名であって「フォルダ」名じゃないんですかね…
上記の場合はどうすればよいのでしょうか?

4 :
for /d %%a in (*) do (ren "%%a" "() %%a")

5 :
>>4
フォルダ=ディレクトリ名だったんですね。
お恥ずかしい限りです。ありがとうございました。

6 :
フォルダ⊃ディレクトリ
ファイルフォルダ=ディレクトリ

7 :
親フォルダにある複数の子フォルダの中で
子\孫\ファイル(子フォルダ内には孫フォルダしかない)場合に
子\ファイルという構造に直したいのですが
この場合どのようにbatを作れば良いのでしょうか?
親フォルダ内…子1子2子3〜フォルダ 当該bat tmp(この為に作成するフォルダ)
子1内…孫フォルダ
子2内…孫フォルダ+ファイル
子3内 ファイル
いま失敗中なのが↓になります。
cd "\Users\owner\Desktop\親\*\"
if exist * () [else
cd "\Users\owner\Desktop\親\*\*\"
move * "C:\Users\owner\Desktop\親\tmp\"
del "C:\Users\owner\Desktop\親\*\"
cd "C:\Users\owner\Desktop\親\tmp\"
move * "C:\Users\owner\Desktop\親\*\"
]
ホント初心者ですいません…
どうかよろしくお願いします。

8 :
>>7
あのさあ、自分で調べたり試したりする気の無いやつには
よほど暇なひきこもりの教えたがりしかレスしてくれないと思うよ
cd "\Users\owner\Desktop\親\*\"
1行目のこれすら思ったように動いてないんじゃない?
コマンドの書き方が間違えてるかどうかなんて
1行ずつ確認すればいいだけなんだからさ
> 子フォルダ内には孫フォルダしかない)場合に
この部分がたぶん君には出来ないと思うけど
今はそれ以前の問題だから出直しておいで

9 :
>>8
大変失礼を致しました。出直してきます。
申し訳ありませんでした。

10 :
孫フォルダが在るか無いかはdir /adすればいいから簡単だけど
孫フォルダしかないってどうやって判定すんの?

11 :
条件無しまでは出来るようになりました。
1for /d %%a in (*) do (cd "\Users\owner\Desktop\親\%%a\*"
2for /d %%b in (*) do (cd "\Users\owner\Desktop\親\%%a\%%b\*"
3cd "\Users\owner\Desktop\親\%%a\*"
4if [not] exist *.* (
5cd "\Users\owner\Desktop\親\%%a\%%b\*"
6move *.* ..
7for /d %%c in (*) do (move "%%c" ..)
8rd %%b
9)))
345削除9))であれば全ての孫内がそのまま子に移り、空の孫フォルダは消えました。
最後の問題はIFなんですが、どこが間違ってるか文法が違うのか…もう頭が回りません。
どうか知恵をお貸しください。よろしくお願いします。
>>8
問題外でしたらすいません。

12 :
>>11
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/if/exist/4-1001.html

13 :
> 4if [not] exist
if exist a.txt ()
if not exist a.txt ()
[] は要らないよ

14 :
>>12
読み取れる内容が沢山あるのだと思いますが、私のレベルでは
とりあえず*.*と*は使えない、かもしれない、という次元なので
もうちょっとしっかり読めるように精進したいと思います。
ご紹介ありがとうございました。
>>13
今まで即オチだったのですが、[]を外して*.txtにしたら無事に処理が終わりました。
後は*.txt以外の拡張子や、フォルダが2つ以上ある場合には処理をしないでおきたいのですが
私のレベルでは今が精いっぱいみたいです…。アドバイスありがとうございました。
>>8
>> 子フォルダ内には孫フォルダしかない)場合に
>この部分がたぶん君には出来ないと思うけど
お恥ずかしながら、案の定出来ませんでした。どうかご教示願えないでしょうか?

15 :
>>14
ファイルにアーカイブ属性が付いていることを前提にできれば
カレントフォルダが子フォルダのときに `dir /aa /b` でforループで回して、
1件以上ヒットしたらファイルがあるってことで判定できるんじゃないかな?
ヒットフラグ保持は環境変数を使う。
軽く考えただけなので 抜けがある or 間違っている かも知れんがw

16 :
>>15
DIRを使った事がなく意義もよく理解できてないので仰る意味が分からないのですが
時間をかけて理解していこうと思います。ありがとうございました。

17 :
dir /a-d >nul 2>&1||dir /ad |find "個のディレクトリ"
これの結果が3ならフォルダが1個しかないってことになるんだが
tmp.txtに一旦書き出すとかしないと受け取れないものなのかな?
別バッチなりサブルーチン化してパス引数にして投げたら
フォルダひとつなら1それ以外なら0を返すとかにしたほうがいいかもな

18 :
dir /a-d >nul 2>&1||for /f "tokens=1,*" %%a in ('dir /ad ^|find "個のディレクトリ"') do (
if %%a==3 (フォルダひとつの時の処理)
)
これでいけるんじゃない?

19 :
昨日はありがとうございました。疲れて寝てしまいました。
>>17
カレントフォルダを子フォルダに移動して紹介して頂いたコマンドを実行しましたところ
子0フォルダに孫0フォルダしかない場合には下記のように表示され
ttp://pc.gban.jp/?p=33896.jpg
子0フォルダに孫0フォルダ以外がある場合には下記のように表示されました
ttp://pc.gban.jp/?p=33897.jpg
どうもありがとうございます!
>>18
無事に目的を達成する事ができました!
構文の意味も合わせて今日はdirの勉強をしたいと思います。
本当にありがとうございました。もの凄く助かりました。

20 :
>>19
よかったね、おめでとう!そしてありがとう!
横からdさせてもらったw
実は俺も初心者なんだけど例えば>>11のカレントフォルダの移動をもっと楽に、
または汎用的にどこのフォルダに置いても出来る方法ってないですかね?

21 :
>>20
試作中みやすく失敗しないようにフルパスで書いてたんですが
>汎用的にどこのフォルダに置いても出来る方法
であれば最初の行にset pass=%~p0を置く事で可能になります。
後は該当箇所に代入してけば親フォルダ\当該batである限りは自動でやってくれると思います。
処理したい親フォルダが沢山ある場合には
set 任意の文字=親フォルダのパスをコピペ
これで複数のbatを作って一か所に置いておくのも便利だと思います。
それで今は、これらをさらに1つのbatで命令できるように考え中です。
私も初心者ですがお互い頑張りましょう!

22 :
>>21
ありがとうございます!出来ました!

23 :
> set pass=%~p0
set DPATH="%~dp0"
のほうがいい
set DPATH="%~dp1"
でバッチに親フォルダをドロップして使える
> 処理したい親フォルダが沢山ある場合には
dlist.bat
main.bat "処理したいフォルダのPATH_1" "処理したいフォルダのPATH_2" "処理したいフォルダのPATH_3"
exit /b
と、処理したいフォルダのPATHのリストをmain.batに渡す別のバッチを用意してmain.batで
main.bat
:loop
set DPATH=%1
REM "%~dp1"でもいいけどdlist.batのほうで""を付けてるなら%1でも問題ないはず
〜処理〜
shift
if exist %1 (goto :loop)
exit /b
とかすればまとめて処理出来る、、と思う。

24 :
訂正
if exist %1 (goto :loop)

if exist "%~1" (goto :loop)
こうしないと最後に%1がないよと怒られる、、かな?

25 :
> 構文の意味も合わせて今日はdirの勉強をしたいと思います。
>nul 2>&1
http://d.hatena.ne.jp/horus531/20101230/1295162296
リダイレクトで調べれ
|| は>>12にもあったけど
コマンド1 || コマンド2
でコマンド1が失敗したらコマンド2を実行する (コマンド1が成功したらコマンド2は実行しない)
コマンド1 && コマンド2
だとコマンド1が成功したらコマンド2を実行 (1が失敗したら2は実行しない)
dir /ad ^|find "個のディレクトリ"
| はパイプといって、
コマンド1 | コマンド2
でコマンド1の標準出力をコマンド2へ受け渡す
コマンド2が標準出力を受け取れないコマンドだと意味無い、、はず
dir /ad の結果を find "個のディレクトリ" へ渡してる
^はエスケープ
for /f %変数 in ('コマンド') do ()
のコマンドの中だとパイプをエスケープしないとエラーになる
他には & ) とかもエスケープが必要かな
あとは各コマンドのヘルプなりググるなりがんばれ

26 :
>>23-24
全部CDの後に代入だったんでp0で間に合うかなと思ったんですが訂正しておきます。
それとset DPATH="%~dp1"は目から鱗な使い方でした。bat同士のまとめ方まで紹介して頂いて
本当に助かります。ありがとうございます。
今から出かけるので試作は遅れますが、是非とも参考にさせて頂きます。
色々とありがとうございました。
>>25
>>18の構文がnul以降からずっとvンカンプンだったので感動しました。
記号だけでぐぐっても検索できないので非常に勉強になります。
有益すぎる解説をありがとうございました。とても学びやすいです。
後は理解できるよう励みたいと思います。多謝!

27 :
[%USERPROFILE%\ping.bat]
%SystemRoot%\system32\ping 192.168.0.1

28 :
batを使ってPowerShellのPolicyを取得してから、
PolicyをRemoteSignedにして、PowerShellを実行させ
その後元のPolicyに戻したいのですが、BATファイル内で
PowerShellのPolicyを扱うやり方が思いつきません。
自分が思いついたのは下記ですがPolicyが変数内に
入りませんでした。
正しいやり方をご存じの方、お教え願えないでしょうか?
PowerShell $Policy = Get-ExecutionPolicy
set PSpolicy=$Policy

29 :
for /f %%I in ('PowerShell Get-ExecutionPolicy') do set PSpolicy=%%I

30 :
>29
早々の回答ありがとうございます。
batのforの使い方を初めて知りました。
恥ずかしながらforはループ関数だと思っていました。
一つ経験値上がったと思います。
本当にありがとうございました。

31 :
>>29とは別人ですが・・・
>>30
いや、forはループ関数だよw
>>29はPowershellの結果の出力が1行しかないから1回だけまわるループ。
コマンドの出力内容がカウンタ変数(%%I)に格納されるから都合がいいってこと

32 :
バッチはforが単なるループ関数ではないと知る事が最初の一歩

33 :
policy変えずに実行すりゃいいのにね

34 :
すいません、質問です。下記のような処理をしたいのですが
どうbatを書けばよいのか分かりません。
Z:\hoge\aaa\あああ\1.txt、2.txt、3.txt、4.txt
↓@           ↓移動   ↓移動
Z:\hoge\bbb\あああ\1.txt、     3.txt
@=1.txtと3.txtを反転させて右クリ>送る>このbat
このbat
set HIRAGANA=
move %1 "Z:\hoge\bbb\%HIRAGANA%\"
平仮名フォルダが沢山あるので、ドロップしたファイルの直前のフォルダ名を
setで設定できれば出来そうな気もするのですが…
dirでググッてみたのですがカレントフォルダ内はあっても
カレントフォルダ自体?の名前をどうやれば取得できるのか分かりませんでした。
どうかご指導のほどよろしくお願いします。

35 :
>>34
ファイル選択して右クリ→batに送る だから
複数ファイルをバッチにドロップしたいってのはわかった
ファイルをmoveさせたいんだとは思うけど
バッチにどういう処理させたいのかがわからん
具体例示して書け

36 :
cd /d "%~dp1"
2>nul "%cd:\="&set "HIRAGANA=%"

37 :
>>35
すいません、単に移動したいだけなんです。利用目的は
aaaフォルダは作業中フォルダでbbbフォルダは作業完了フォルダ
bbbにはaaaのバックアップ(txt以外)を取っていて
aaaの個別フォルダ内で、完了時に右クリから送りたい
(bbbフォルダで同名の個別フォルダを探すのが面倒)
というのがbat作成の動機でもあります。
気概のない処理でごめんなさい><

38 :
>>36
ありがとうございます!できました!!!!

39 :
1個づつは出来るようになったので、後は複数反転を処理できるよう
ずっと試行錯誤していたのですが結局できませんでした・・・orz
もしよろしければアドバイスを頂けないでしょうか?
移動する予定のテキストは1.txtから●1.txtのように、手動で
文頭に●を加えて、aaaフォルダの検索窓(windowsエクスプローラ)
から●のあるテキストを探して全て反転させ、右クリ>このbat
で移動したいと考えています。
@for %%A (%*) do (
Acd /d "%%~dpA"
B2>nul "%cd:\="&set "HIRAGANA=%"
Cmove "%%A" "Z:\hoge\bbb\%HIRAGANA%\"
D)
自分的にはこれが一番近いような気がするのですが
cmdは一瞬しか立ち上がりませんでした。
引き続き恐縮なのですが、どうかアドバイスを頂けないでしょうか?
ご指導ご鞭撻のほどよろしくお願いします。

40 :
>>39
dir /b /s z:\hoge\aaa\●*.txt
プロンプトで実行してみ
for /f %%A in ('dir /b /s z:\hoge\aaa\●*.txt') do ()
とかで取り込めば?
バッチの先頭のほうで
set aaa=コピー元パス (z:\hoge\aaa)
set bbb=コピー先パス (z:\hoge\bbb)
とか設定するようにしておけば
ダブルクリックで実行したりタスクスケジュールで定期的に実行したり出来るよ
for /f %%A in ('dir /b /s %aaa%\●*.txt') do ()
こんな感じで
>>39のコマンドがダメなのは確認して無いけど遅延展開してないからだと思う
forの中は
call :sub %%A
とか使ってサブルーチン化するのが楽じゃないかな

41 :
すいません、さっきの文頭「●」は文頭「処理」に変更しました。
●で検索したら大変なことになりました(汗)
えっと、それでさっきのソースなんですが、@のforの後にinを忘れてました。
@for %%A in (%*) do (
今度は無事に立ち上がりました。しかし上手くはいきませんでした。
moveの実行でZ:\hoge\bbb\以降から何故かCドライブに続いて
;というマークを区切りにいくつもの関係無いフォルダを辿って行ったみたいでした。
要求されたパスまたはファイル名は受け付けられません。とのことでした。
ここでCをmove %%A "Z:\hoge\bbb\"
で%HIRAGANA%を省くと全ての選択ファイルをbbbフォルダには移動してくれました。
ここから先はどうすればよいのか分からないですが…
とりあえず寝ます。連投失礼しました。
>>40
アドバイスありがとうございます!
さっそくやってみたいと思いますが、ちょっと眠気が…
寝てしまったらすいません。けどありがとうございました!

42 :
なんか抜けてたんで。。
> とか設定するようにしておけば
> ダブルクリックで実行したりタスクスケジュールで定期的に実行したり出来るよ
とか設定するようにしておけば後で対象のパスが変わっても修正が楽になる
どうしても右クリ送るで対象のパスをバッチに送って%*で受け取りたいってわけじゃないなら
バッチで対象のパスを探させたほうが楽じゃないかな
ダブルクリックで実行したりタスクスケジュールで定期的に実行したり出来るよ

43 :
> ここでCをmove %%A "Z:\hoge\bbb\"
> で%HIRAGANA%を省くと全ての選択ファイルをbbbフォルダには移動してくれました。
> ここから先はどうすればよいのか分からないですが…
遅延展開で調べてみ
Acd /d "%%~dpA"
B2>nul "%cd:\="&set "HIRAGANA=%"

echo off で見たら
Bが上手く動いてないはずだと思うよ
だから>>40で言ったようにcall使ってサブルーチン化

44 :
>>42>>43
わざわざありがとうございます。よく読んで勉強したいと思います。
すいません、あと、自分で言って何なんですが
文頭の「●」や「処理」をコマンドで取り込むのは
出来れば最終手段の方向でお願いします。
というのも、テキストファイルだけなら良いのですが、他にも編集する拡張子があって
それらは別のソフトで編集しながら、そこで付けたタグやメタデータから
ソートして集めて反転、これをソフトからbatにボタンでドロップして移動する頻度の方が多く
●や処理などのリネームはtxtは良いのですが他が二度手間になってしまうので…
せっかくのアドバイスに難癖をつけてしまって申し訳ありません。
ただ、とても参考になりました。echo offと遅延展開、それとサブルーチン化
dirの使い方など勉強になります。初めての事ばかりですが試行錯誤してみます。
調べてみます。ありがとうございました。

45 :
@echo off
:loop
if "%~n1"=="" goto end
rem ここに処理を書く
echo %~n1
shift /1
goto loop
:end
echo end
pause

46 :
>>45
ありがとうございます!目的の半分は達成しました!というのも
aaa\あああ\1.txtと2.txtはbbb\あああ\に移動できたのですが
aaa\あああ\1.txtと2.txt、aaa\いいい\3.txtと4.txt
これら4つを反転させた状態でbatにドロップするとbbb\いいい\
に全てが移動してしまうようでした。rem ここに処理を書く、の下の行に
cd /d "%~dp1"
2>nul "%cd:\="&set "HIRAGANA=%"
move %1 "Z:\hoge\bbb\%HIRAGANA%\"
と書いた場合もそうですが、駄目もとで
for %%A in (%*) do (
cd /d "%%~dpA"
2>nul "%cd:\="&set "HIRAGANA=%"
move %%A "Z:\hoge\bbb\%HIRAGANA%\"
)
と書いた場合も同様でした。
私の書き方がまずいんだと思うので、なんとか頑張ってみます
ありがとうございました!

47 :
右クリbat
for %%A in (%*) do (call "C:\3.script\tst\sub.bat" %%A)
sub.bat
cd /d "%%~dpA"
2>nul "%cd:\="&set "HIRAGANA=%"
move %%A "Z:\hoge\bbb\%HIRAGANA%\"
>>40から見よう見真似で作ってみました。
多分構文が凄い間違ってるので%Aが引き継がれなくて何も起きませんでした。
もうちょっと勉強してきます。次はgoto…
あぁ頭良くなりたい眠いくっそおお

48 :
あれ!?え!どうして!!?
>>45からまた始めたのですが、さっきは失敗したのに何故か成功しました!
おそらく最初のforでinを忘れたように、何か文字が抜けてたんだと思います。
ありがとうございました!これで完璧に達成できました!
皆様本当にありがとうございました!
これでやっと寝れる・・・6時か・・・・・・眠眠打破かってきます
けど凄い嬉しい目がしゅわしゅわする

49 :
バッチかWSHかで高速なAND検索って出来ないですかね?
今は単語毎にfindで探してerrorlevelを見て、全部の単語でerrorlevelが0だったら
マッチという風にやってるんですが、これが正直遅いです。

50 :
findstr

51 :
findstrをfindと同じ使い方をしたらもっと遅いんですが…
単純に指定しただけではOR検索になる仕様ですし、
正規表現でAND検索をやるには前後の組み合わせを変えてOR検索するという
馬鹿みたいな表記になり、2語程度が限界ですが。

52 :
orのfindstr出力をfindでandする

53 :
言っている事がよくわからない…
aaa bbb ccc ddd でAND検索を現状は
サブルーチンに渡して
:sub
echo %hoge% |find "%~1"
if errorlevel 1 goto :eof
shift
goto :sub
みたいなことやってるわけなんだけど…
findstrの出力をfindでandする? 2語の話じゃないですよね?

54 :
最初からそれ書けあほ
ファイル処理だと思うだろがばか
環境変数の:=置換を使えぼけ

55 :
ファイルの検索だったとして、結局同じだけどどういう意味だったの?

56 :
ファイルの検索だったとして、結局同じだけどアホには無理

57 :
多分自分で間違えてるの気付いてないんだと思うけど。

58 :
>>39
for %%A in (%*) do (
set X=%%A
call move %%A %%X:\aaa\=\bbb\%%
)

59 :
ドロップしたファイル名を set で取り込みたいのですが & が含まれているときに
そのファイル名全てを受け取るにはどのようにすればいいのでしょうか?

60 :
ファイルかフォルダ名に空白を入れとけ
でなきゃ難しいからやめとけ

61 :
そうなんですか。
別の方法あたってみます。
自分で名前をつけたなら & なんてヤな気配のする文字は使わないんですけどね……
!! とか……

62 :
!もやめとけ 遅延展開で困るかも

63 :
先日はお世話になりました。
>>58
お返事遅れてしまい申し訳ありません。どうもありがとうございました。
先ほど試してみたらこれだけで移動する事ができました!ものすごく感動しました!
そこで是非とも意味を理解したく:や=や単体での%%の使い方、またはfor %%A in (%*) do (set X=%%A
の意味を調べているのですが、なかなか見つかりません。
なので、もうこうなったらbatの優しい参考書があれば購入しようと思うのですが
何か初心者にも分かり易いものはありますでしょうか?

64 :
for/?
set/?
call/?
以上で十分

65 :
昔なら良書もあったが、いまどきはねぇ・・・
Webなら初心者向きHPも腐るほどあるから、お金出さずに勉強できるよ
(古い情報のまま放置のところもあるけど)

66 :
>>64
穴が空くまで読めということですね。ありがとうございました。
>>65
Webの場合は全てのHPを行き来すれば網羅的だと思うのですが
この行き来をなくして、馬鹿な私もついていけるような前提から説明して一緒にbatを作り上げるような
そんな本であれば購入しようと思っていたのですが、古い情報だとまずかったりするのですね。
HPをめぐって勉強しようと思います。ありがとうございました。

67 :
>>66
古い情報でもまずいことはあまりないのだが、cmdやコマンドもOSによっていろいろ進化しているから
昔は何行もバッチを書いていたのが今ではコマンド1発でいろいろ出来てしまうことが多々ある。
WinNT系ではWin9xまで(DOS含む)に比べて大幅に機能が拡張されているから、
HPを見つけたらいつ頃書かれたものなのか意識していくといいと思う。(書いていないことが多いが)
いまどきから始めるならバッチよりもWSHの方がいいのかなぁ・・・

68 :
いまどきWSH???

69 :
5.6で機能強化の止まってしまったWHSなぁ

70 :
5.7だけど

71 :
そやな

72 :
せやな

73 :
WSHだけど
爺さん婆さんみたいだな ムヒをヒムとか

74 :
をパンスとか

75 :
初めてのプログラムでbatに挑戦したいと思うのですが
下記のような事はbatでも出来ますか?
フォルダ名が『レーベル] タイトル』のものと『タイトル』のものが沢山あり
これらの中からタイトルが殆ど一致するものを検索し、該当するフォルダについては
txtかエクセルに出力し、そこにフォルダ名とパスとサイズとファイル数を表示したいと思ってます。
よろしくお願いします。

76 :
すいません、フォルダ名には他にも
『[レーベル] タイトル (ジャンル)』というものがありました。
正規表現を使って末尾から一致を探そうと思ったのですが
これはちょっと困りました・・・

77 :
>>76
> タイトルが殆ど一致するものを
殆ど一致て似たものもってこと?「殆ど一致」ではなく「完全に一致」で
フォルダ名の書式が
[レーベル] タイトル (ジャンル)
[レーベル] タイトル
タイトル
が厳密に守られていて、且つ
レーベル、タイトル、ジャンルの文字に "]" "(" の文字が使われて居ないならば
やる気さえあれば出来るよ
ただこれから始めるような人には敷居がちょっと高いかもね
とりあえず"[レーベル] タイトル (ジャンル)"から
"タイトル"を抜き出す方法からやってみるといい

78 :
>>77
タイトルの先頭や末尾に加えてメモが書いてあったりするフォルダもあり
また、稀にですがアルファベットや記号で半角全角など違う場合もあるので
殆ど一致であれば全てカバーできるのではないかと、そう表現しました。
フォルダ名の形式についてはタイトル以外は殆ど厳密に守られていると思いますが
タイトル(ジャンル)このように半角スペースが入ってないフォルダも結構ありました。
とりあえず敷居は高いとはいえ出来ない事はない、と聞いてやる気が湧いてきました。
ご指摘頂いた「タイトルを抜き出す方法」をまずは学んでみます。
どうもありがとうございました。

79 :
> アルファベットや記号で半角全角など違う
出来るか出来ないかで言うと出来ないことってあまり無いよ
ただ、ものによっては実装するのにすごく手間がかかるので
別の言語を使うほうが楽だったりして現実的ではなかったり
if /i で大文字小文字の違いは無視して比較出来るけど
半角全角は無視出来ないから、一旦全角を半角に直して比較、、
とかならやれなくないけど面倒だね
フォルダ・ファイル名、一括リネームソフトとかで手直ししてから使うとか
もっと言えば、わざわざBATで書いて作らなくても
正規検索で "タイトル"の一致するPATHを書き出してくれる
フリーソフトを探せばあるんじゃないかな?
BAT書いてみたくて身近なネタがそれだったとかなら別だけど。
目的の為の手段としてBATで書くってなら近いフリーソフトを探したほうがいいよ
あと77の方法だけど set の環境変数の置換使って
](を区切り文字みたいに使えば楽に出来るよ
set a=%a:*]=%
うしろは一工夫すれば出来る

80 :
>>79
ご丁寧にありがとうございます。
半角全角については結構大変なのですね。
batでなくても難しいみたいなので、今回は未対応で作りたいと思います。
フリーソフトでも正規検索で結果を書きだす事が可能とのことで
こちらでも検討してみます。ただ、今は正規表現さえままならない状態であるのと
今回の処理以外にもやってみたいプログラミングがあるので、まずはbat
(または他に初心者でもやりやすい言語があればそれで)でやってみます。
お気遣いありがとうございました。
また、紹介して頂いたsetなんですが、もしよろしければ質問させて下さい。
set a=%a:元=先%はどこかで見てメモしたのですが、
set a=%a:*]=%この場合には先がないですよね?この場合には
*]を%aで表現できるという事でしょうか?つまり、()の場合には
set b=%b:(*=%によって%bで表現できるとことでしょうか?
…すいません、自分で検証してみろって話ですね。失礼しました。
後はifを使って%a %b以外で一致する場合には[コマンド1]をするみたいな感じで検討してみます。
沢山のヒントをありがとうございました!

81 :
すいません、凄い初歩でつまづいたのですが、どうか質問をさせてください。
まずはcmdと正規表現の繋がり、基礎を学ぼうと
http://ykr414.com/dos/dos02.html#09
ここの使用例を参考に、Cドライブ直下にaaaフォルダを置いて、そこに
bbb.txt(中身は適当でテキストという文字も入れた)と、試作.batを入れ、batには
>findstr テキスト bbb.txt
pause
と書いて、これをクリックしたのですが
’テキスト’は操作可能なプログラムまたはbatファイルとして認識されていません
と表示されてしまいました。
なんとか調べてコマンドプロントからcd/をして
C:\aaa>findstr テキスト bbb.txt
とした場合には、「アクセスが拒否されました」と表示されてしまいました。
これは何がまずいのでしょうか?こんな調子で先が思いやられますが…
どうかよろしくお願いします。

82 :
> set a=%a:*]=%この場合には先がないですよね?この場合には
> *]を%aで表現できるという事でしょうか?
set a=ab]cd(ef
echo %a%
echo %a:*]=%
> set b=%b:(*=%によって%bで表現できるとことでしょうか?
*は先頭から次の文字までの一致は出来るけど
"(*"という風に後方の一致には使えない
だから一手間かかる
set a=ab]cd(ef
set b=%a:*(=%
echo %b%
call set c=%%a:%b%=%%
echo %c:~0,-1%
call set c=%%a:%a:*(=%=%% こう書けばset b要らないが
わかりにくいかと思って一旦%b%としてる
遅延展開使えばcall使わなくても出来るけど
文字列に"!"が入ってると一旦別の文字へ置換して後で戻したりとかすることになる

83 :
findstr "テキスト" "bbb.txt"

84 :
>>82
見よう見まねでbatを作ってみたのですが
とても分かりやすい展開で勉強になりました!
分からない行もありましたが、じっくり解読できるよう励んでみます。
ご丁寧にどうもありがとうございました。
>>83
ありがとうございます、出来ました!
batの場合は""が必要なんですね。
cdの操作はカレントディレクトリの移動が出来てないだけでした。
失礼しました。

85 :
XPと7で処理を分けたい場合ってどうやればいいんですか
環境変数
OS=WINDOWS_NT
ってもうなんの意味もない気が…

86 :
ver

87 :
>>82
昨日はありがとうございました。
もう殆ど答えを頂いていたのですが、あれから何回も見直して
大方を理解すると共に、cdの抜き出しに成功できました!
set a=ab]cd(ef
echo %a%
set b=%a:*(=%
echo %b%
call set c=%%a:%b%=%%
echo %c%
set d=%c:~0,-1%
echo %d%
set e=*]
echo %e%
call set title=%%d:%e%=%%
echo %title%
pause
後は上記の1行目を
set full=%1
echo %full%
set a=%full:*\=%
に変えたらドロップしたフォルダ名からも抽出できました!
今はifとforを調べているのですが
もしよろしけば次にやるべきことを教えて頂けないでしょうか?
どうかよろしくお願いします。

88 :
すいません、出来たと思っていたのは
"[ab] cd (ef)"ネームのフォルダだけでした。
"[ab] cd"の場合には別途それに合うbatでないと駄目でした。また、
set full=%1
set a=%full:*\=%
とさっきは書きましたが、これは後の*]で運よくパスを削って貰っていただけで
"cd"ネームのフォルダには対応できませんでした。
どうすればsetにフォルダ名だけを載せれるかわかりません。
それも問題ですが他にも頓挫してる場所がありまして
もしよろしければダメ出しをして頂けると嬉しいです。
以下に作ってみたbatを書きます。もしお手数でなければ診てやって下さい。
よろしくお願いします。連投すいません。

89 :
"abcdef.bat"
set full=%1
set a=%full:*\=%
set b=%a:*(=%
call set c=%%a:%b%=%%
set d=%c:~0,-1%
set e=*]
call set title1=%%d:%e%=%%
echo %title1%
rem ↑ここまでさっきと同じ。[ab] cd (ef)ネームの場合だけ成功。"[ab] cd"ネームの場合はここまでくる途中で既にボロボロになってるので、そのボロボロを一回放棄(null?どうやって挟む?)が↓のためになるのか検討中。
if i not exist %title1% (call abcd.bat) else call hikakuj.bat
rem 他のbatに渡らない。今は↑を試行錯誤中
"abcd.bat"
set full=%1
set a=%full:*\=%
set b=*]
call set title2=%%a:%b%=%%
echo %title2%
rem ここまでは[ab] cdネームであれば成功。以下略失敗
if i not exist %title2% (call cd.bat) else call hikaku.bat
"cd.bat"
rem そもそも失敗
set full=%1
set title3=%full:*\=%
echo %title3%
if i exist %title3% (call hikaku.bat)
"hikaku.bat"
rem まだ渡ってさえいない
if i %title1%==%title2% ()改行if i %title1%==%title3% ()改行if i %title2%==%title3% ()

90 :
とりあえず "コマンド バッチ" でググれ
あと
set /?
for /?
if /?
call /?
くらいはよく読んでわからなければ試してどういう動作になるか確認して覚えれ
バッチにドロップしたフルパスの取得とフォルダ名の取得は
set DPATH="%~1"
set DNAME="%~nx1"
文字列は常に""で囲まれるようにしないと
バッチの中で特別な意味のある"&"なんかの文字が含まれていた場合、誤動作してエラーになる
そういった対処しながら"タイトル"を抜き出そうとすると
set b=%a:*(=% は set b="%a:*(=% こうなったり。削る側の外側に"を置く。
set d=%c:~0,-1% は set d=%c:~0,-2%" 他にも細かく変更が必要
](があったりなかったりする場合は該当の文字があるかないか判別して
あれば処理をする。といった判定処理が必要になってくる
"[レーベル] タイトル (ジャンル)"
"[レーベル] タイトル "
" タイトル "
"タイトル"
処理の流れとしたらこんな感じかな
最後に" タイトル "の先頭末尾 (実際には2文字目と後ろから2文字目) が
" 半角空白" " 全角空白"かを判定して真なら削ってループ。偽なら抜ける。
で"タイトル"の取得完了
echo on にして途中で echoして pause入れて確認したりとかしながらがんばれ
複数のパス渡して"タイトル"の重複を比較するとなると
"フルパス" "タイトル"を関連付けて環境変数に保持することになるから動的な配列とかかな
http://d.hatena.ne.jp/jak-san/20090308/1236501217
この辺参考になるかもね

91 :
>>90
とても為になるアドバイスをありがとうございました。
未だ変数、装飾子、文字列の区別も曖昧ですが、今後は文字列を意識して見ていきたいと思います。
また、%~nxは名前.拡張子の表示だと思っていたのですが、フォルダにも使えるのですね!
そして、私は%1なら""付きだからと安心していたのですが、%~1でこれを""で囲った方が良いのですね。
今後はそのようにします。そして](の判定ですね。上記を修正したら取りかかりたいと思います。
紹介頂いたURLまでたどり着けるように頑張ります。どうもありがとうございました。

92 :
>>91
"タイトル"同士を厳密に比較出来なくて良くて
対象フォルダが全て同じフォルダにある
パスの書き出しのみ
というエクスプローラーで検索と変わらないようなので良ければもっと簡単に出来るよ
c:\test\music 以下にあるなら
dir /ad /b /s "c:\test\music" | find "タイトル"
この結果をテキストに整形しながらリダイレクトするとかでリスト化は可能かな

93 :
入力上call set c=%%a:%b%=%%
画面上C:\test\juufuku>call set c=%a:"甲乙&&!!?)"=%
なのにecho %c%をすると
"[あああ] aaa (甲乙&&!!?)"削れてない・・・orz
call set c="%%a:%b%=%%だと認識されないしset b="%a:*(=%との違いが分からないや…
明日set /?から"を探してみよう。
この説明もtxt出力出来れば楽に見れるんだけどな・・・それも明日にしよう
>>92
"タイトル"を抜き出す事が出来ましたらさっそくやってみます。
私には今の段階でもかなりキツいので、ここらへんが潮時なのかもしれません。
渡りに船になればよいのですが、ご紹介ありがとうございました。

94 :
>>93
%変数:置換文字列=置換後文字列%
set a=abcdef
echo %a:ab=123%
echo %a:ab=%
call set c=%a:"甲乙&&!!?)"=%
これだと置換する文字列は「"甲乙&&!!?)"」
(「」は含まず。以下も同じ)
%c%が 「"[あああ] aaa (甲乙&&!!?)"」
だとすると
「甲乙&&!!?)"」なら存在するが
「"甲乙&&!!?)"」は存在しない
call set c=%%a:%b%=%%
%b%の文字列を""で囲みつつ""を外して使いたいなら
%b:~1,-1%
こう直せばいい
call set c=%%a:%b:~1,-1%=%%
> この説明もtxt出力出来れば楽に見れるんだけどな
set /? >sethelp.txt
リダイレクトでテキストファイルに書き出せばいい

95 :
"あいう" と書いた時に認識されてるのは「あいう」という文字列ではなく
「"あいう"」という文字列
%a:"あいう"=% で置換されるのは 「123"あいう"えお」であり
「123あいうえお」には反応しない

96 :
>>94-95
ありがとうございます。もの凄く分かりやすかったです。
echo %a%→"[あ&あ] a&a (甲&乙)"  "も普通の文字
echo %b%→        "甲&乙)"  "も普通の文字
%b%の「"甲&乙)"」は%a%で存在(完全一致)しないので%a%から%b%は検出できない
なので、%b%を「甲&乙)」の形にして、完全一致にもっていく。と理解しましたが
どうした訳か上手くいきません・・・orz
rem フォルダ名「[あ&あ] a&a (甲&乙)」これを↓のbatにマウント
set a="%~nx1"
echo %a%
set b="%a:*(=%
echo %b%
1、call set c="%%a:%b:~1,-1%=%%
→C:\test\juufuku>call set c="%a:甲&乙)=%
2、call set c="%%a:%b~1%=%%
→C:\test\juufuku>call set c="%a:甲&乙)"=%
1&2、echo %c%
→C:\test\juufuku>echo
→ECHOは <ON> です。
1&2、rem %c%←この場合はC:\test\juufuku>remとしか表示されす、以降のコマンドもバグッたままでした。
helpを入手しました。どうもありがとうございました。

97 :
@echo on
setlocal disabledelayedexpansion
set a="[あ&あ] a&a (甲&乙)"
set b="甲&乙)"
set b=%b:&=^&%
call set c=%%a:%b:~1,-1%=%%
echo %c%
pause
exit /b

98 :
>>97
"タイトル"を無事に抜けました!
とりあえず困った時は&を^&にしてみます!ありがとうございます!
ただ、紹介頂いたコマンドでは遅延展開をsetlocalで無効とのことでしたが
私の方ではそれを外してしまいました。遅延展開が良く分からないので調べてみます。
::成功
rem :ABCDEF
set a="%~nx1"
echo %a%
set b="%a:*(=%
echo %b%
set b=%b:&=^&%
echo %b%
call set c=%%a:%b:~1,-1%=%%
echo %c%
set d=%c:~0,-3%"
echo %d%
call set title1="%%d:*] =%%
echo %title1%
→"a&a"
rem goto END
pause
今からifで"[レーベル] タイトル"と"タイトル"を頑張りたいと思います。
ただ、昨日もとりあえず&がないバージョンでやってみたんですが
if /i exist "](" (goto ABCDEF) else (goto ABCD1)
この"]("や"]"では判別がうまくいきませんでした。
とりあえず専念してみます。ほんとうにありがとうございました。

99 :
発想を変えてforから%title1,2,3%を抜こうと思ったのですが
@echo on
setlocal disabledelayedexpansion
for /D %%X in (*]*"("*) do (
echo a="%%~X"
set a="%%~X"
echo %a%
set a=%a:&=^&%
echo %a%
)
pause
http://www.dotup.org/uploda/www.dotup.org2111797.jpg
こうなってしまいます。これを解決したとして
"[レーベル] タイトル"の場合にfor /D in (*]*)これだと先の (*]*"("*) も含まれてしまい上手くいきません。
今はこれが精いっぱいなんですが、このエネルギーを
for /D %%X in (*) do (if exist ファイル名 (goto ABCDEF) else goto ABCD)
これの形に全力投球しても良いでしょうか?
ifのファイル名を何とかforの(セット)みたいに出来ないか検索中です。
方向性が合っていれば良いのですが…どうかよろしくお願いします。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
71: 雑談スレ 4 (214)
72: WindowsDDK各種についてのスレ (734)
73: 【関数化】ビット演算 0x03 (828)
74: お前ら何歳のときからプログラミングやってんの? (813)