1 名前:デフォルトの名無しさん mailto:sage [2011/09/13(火) 01:20:20.25 ] 拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる 質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。 ※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。 前スレ 【.cmd】 バッチファイルスクリプト %7 【.bat】 hibari.2ch.net/test/read.cgi/tech/1298873550/ 【.cmd】 バッチファイルスクリプト %6 【.bat】 hibari.2ch.net/test/read.cgi/tech/1277465356/ 【.cmd】 バッチファイルスクリプト %5 【.bat】 pc12.2ch.net/test/read.cgi/tech/1242268171/ 【.cmd】 バッチファイルスクリプト %4 【.bat】 pc12.2ch.net/test/read.cgi/tech/1229955189/ 【.cmd】 バッチファイルスクリプト %3 【.bat】 pc11.2ch.net/test/read.cgi/tech/1217860043/ 【.cmd】 バッチファイルスクリプト %2 【.bat】 pc12.2ch.net/test/read.cgi/tech/1197881068/ 【.cmd】 バッチファイルスクリプト %1 【.bat】 pc11.2ch.net/test/read.cgi/tech/1178281991/
92 名前:デフォルトの名無しさん mailto:sage [2011/10/06(木) 21:21:41.03 ] >>91 "タイトル"同士を厳密に比較出来なくて良くて 対象フォルダが全て同じフォルダにある パスの書き出しのみ というエクスプローラーで検索と変わらないようなので良ければもっと簡単に出来るよ c:\test\music 以下にあるなら dir /ad /b /s "c:\test\music" | find "タイトル" この結果をテキストに整形しながらリダイレクトするとかでリスト化は可能かな
93 名前:デフォルトの名無しさん mailto:sage [2011/10/06(木) 22:34:23.34 ] 入力上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 名前:デフォルトの名無しさん mailto:sage [2011/10/06(木) 23:25:49.60 ] >>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 名前:デフォルトの名無しさん mailto:sage [2011/10/06(木) 23:26:46.18 ] "あいう" と書いた時に認識されてるのは「あいう」という文字列ではなく 「"あいう"」という文字列 %a:"あいう"=% で置換されるのは 「123"あいう"えお」であり 「123あいうえお」には反応しない
96 名前:デフォルトの名無しさん mailto:sage [2011/10/07(金) 16:45:46.83 ] >>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 名前:デフォルトの名無しさん mailto:sage [2011/10/07(金) 18:05:02.34 ] @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 名前:デフォルトの名無しさん mailto:sage [2011/10/07(金) 18:59:13.39 ] >>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 名前:デフォルトの名無しさん mailto:sage [2011/10/07(金) 20:39:45.92 ] 発想を変えて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 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の(セット)みたいに出来ないか検索中です。 方向性が合っていれば良いのですが…どうかよろしくお願いします。
100 名前:デフォルトの名無しさん mailto:sage [2011/10/07(金) 21:02:23.01 ] すいません、書き方が間違っていました。 正確にはこうでした。 www.dotup.org/uploda/www.dotup.org2111896.jpg
101 名前:デフォルトの名無しさん mailto:sage [2011/10/07(金) 21:51:38.52 ] @echo on setlocal disabledelayedexpansion set DNAME="[あ&あ] a&a (甲&乙)" echo %DNAME%|find "(" 1>nul if errorlevel 1 ( set DTITLE=%DNAME% ) else ( call :DEL_GENRE ) echo %DTITLE%|find "]" 1>nul if not errorlevel 1 ( set DTITLE="%DTITLE:*]=% ) call :DEL_SPACE echo %DTITLE% pause exit /b :DEL_GENRE set DGENRE="%DNAME:*(=% set DGENRE=%DGENRE:&=^&% call set DTITLE=%%DNAME:%DGENRE:~1,-1%=%% set DTITLE=%DTITLE:~0,-2%" exit /b :DEL_SPACE rem DTITLE前後の空白文字削除処理 exit /b "[あ&あ] a&a 甲&乙)" も "[あ&あ a&a (甲&乙)" も大丈夫だが "[あ&あ a&a 甲&乙)" は失敗する "[あ&あ a&a 甲&乙" だと大丈夫だから ")" のみだとマズいのかも。よくわからん
102 名前:デフォルトの名無しさん mailto:sage [2011/10/07(金) 22:18:03.36 ] >>101 こんなに沢山書いて頂いて本当にありがとうございます! findと1>nulとif errorleve 1さらにcallまで使用して頂いて とても勉強になります!よく意味を調べて 使えるようになった上で適応させてみます! こんなコマンドがあったんですね!盲目になってました。 今日は寝るまで>>101 のコマンドを解読しようと思います。 ご丁寧にどうもありがとうございました!
103 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 01:58:10.42 ] >>101 > "[あ&あ a&a 甲&乙)" は失敗する if not errorlevel 1 ( set DTITLE="%DTITLE:*]=% ) これがダメ if not errorlevel 1 ( call :DEL_LABEL ) call 使ってここもサブルーチン化
104 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 02:40:16.51 ] if not errorlevel 1 set DTITLE="%DTITLE:*]=% ()使わなければいいんじゃねーの? callしといたほうが無難そうだけどな
105 名前:36 mailto:sage [2011/10/08(土) 03:29:47.11 ] すいません、質問なんですが batって最大でいくつくらい同時に起動しても大丈夫でしょうか? batとは関係ないのですが 以前単なるD&Dでドライブをまたいてファイルなどを一気にコピーした際に(80GB程度) どうゆう訳かコピーが出来ていないファイルや使えなくなったファイルありまして… 同時起動するbatについては処理中には特にPCも重くならないのですが 先のD&Dのような破損やバイナリが変わったらどうしようと思い質問しました。 bat自体の数は1つで下記になります。>>45 さんに作って頂いたものです。 @echo off :loop if "%~n1"=="" goto end cd /d "%~dp1" 2>nul "%cd:\="&set "HIRAGANA=%" move %1 "Z:\hoge\bbb\%HIRAGANA%\" echo %~n1 shift /1 goto loop :end echo end pause 使っているソフトウェアからファイルをこのbatに送る際 ソフトウェアの制約で複数ファイルを送る場合には その複数ファイル個分だけこのbatを多重起動させる必要があるのです。 batを起動できる個数は設定上Simultaneous runs;Unlimitedで無制限ですが 今は不安なので5個程度、10個以上の場合は実際のbatにソフトウェア上からドロップしています。 ファイルは1つ50MB程度で、同一ドライブ内での移動になります。 何か思い当たるところがありましたらコメントを頂けると助かります。 それではどうかよろしくお願いします。
106 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 05:10:28.71 ] > batって最大でいくつくらい同時に起動しても大丈夫でしょうか? OSの仕様や搭載メモリ容量によるかもしれんし俺にはよくわからん。すまんね > 以前単なるD&Dでドライブをまたいてファイルなどを一気にコピーした際に(80GB程度) > どうゆう訳かコピーが出来ていないファイルや使えなくなったファイルありまして… firefilecopy使え ベリファイ出来るしcuiからも使えるからbatに組み込むことも出来る > 使っているソフトウェアからファイルをこのbatに送る際 > ソフトウェアの制約で複数ファイルを送る場合には > その複数ファイル個分だけこのbatを多重起動させる必要があるのです。 パスひとつずつbatに送ってるならもしかして上のスクリプト意味無いんじゃないの? その「使っているソフトウェア」とやらのサポートかスレで聞け
107 名前:36 mailto:sage [2011/10/08(土) 07:55:45.20 ] >>106 いえいえ、とんでもないです。 firefilecopyちょっと実験してみます。 ちなみにPCスペックは下記になります。 CPU core2cuo 2.9GHz メモリ 4G OS vista 64bit >上のスクリプト意味無いんじゃないの? 複数用のbatで1つだけファイルを処理しているので、全く意味が無いわけでは無いですが 殆ど無駄になっている感じではあります。せっかく皆様に教えて頂きながら作ったのに こちらこそ申し訳ないです。ただ、ソフトウェア上から送る場合にはbat複数起動ですが ソフトウェア上から実際のbatにD&Dする場合にはbat1つだけ起動して処理できています。 ただ、これが多少おっくうなので、送るボタン(複数起動)で処理したく伺わせて頂いた次第です。 ありがとうございました。
108 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 08:36:49.94 ] >>107 @echo off if not exist "%~1" goto :eof set fpath="%~1" move %fpath% %fpath:\aaa\=\bbb\% それならこれだけでOK ffc.exe使うならmoveと差し替えて適切なコマンドラインスイッチを追加
109 名前:102です!出来ました! mailto:sage [2011/10/08(土) 12:16:55.81 ] set DNAME="フォルダネームを手入力"については全て問題なく?出来ました。 しかし、ドロップしたフォルダについては"タイトル"(&入り)だけ出来ませんでした。 名前がabc&defだとしたら、一番最初のset DNAME="%~nx1%"で&の手前のabcまでしか入らないみたいでした。 何度も晒して恐縮なんですが、また暫定のbatを下記に書いておきます。 もしよろしければアドバイスを頂るとありがたいです。 @echo on メイン setlocal disabledelayedexpansion set DNAME="%~nx1%" echo %DNAME%|find "(" 1>nul if errorlevel 1 ( set DTITLE=%DNAME% ) else ( call :DEL_GENRE ) echo %DTITLE% echo %DTITLE%|find "]" 1>nul if not errorlevel 1 ( call :DEL_LABEL ) echo %DTITLE% echo %DTITLE%|findstr /r /c:"^. ." 1>nul if not errorlevel 1 ( call :DEL_SFARST ) echo %DTITLE% echo %DTITLE%|findstr /r /c:"^. ." 1>nul if not errorlevel 1 ( call :DEL_BFARST ) echo %DTITLE% echo %DTITLE%|findstr /r /c:". .$" 1>nul if not errorlevel 1 ( call :DEL_SLAST ) echo %DTITLE% echo %DTITLE%|findstr /r /c:". .$" 1>nul if not errorlevel 1 ( call :DEL_BLAST ) echo 完成したタイトル=%DTITLE% pause exit /b
110 名前:続き mailto:sage [2011/10/08(土) 12:19:50.67 ] :DEL_GENRE set DGENRE="%DNAME:*(=% set DGENRE=%DGENRE:&=^&% call set DTITLE=%%DNAME:%DGENRE:~1,-1%=%% set DTITLE=%DTITLE:~0,-2%" exit /b :DEL_LABEL set DTITLE="%DTITLE:*]=% exit /b :DEL_SFARST set DTITLE="%DTITLE:~2% exit /b :DEL_BFARST set DTITLE="%DTITLE:~2% exit /b :DEL_SLAST set DTITLE=%DTITLE:~0,-2%" exit /b :DEL_BLAST set DTITLE=%DTITLE:~0,-2%" exit /b また、現在はいよいよbatクリックでその階層に表示されている、全てのフォルダから"タイトル"を抜く処理に取り掛かっているのですが、これもうまいこといきません。例えば3行目を for /D %%X in (*) do ( 改行 set DNAME="%%~X" に置き換えて、forの〆である「)」をどこにおけば良いのか試行錯誤してるのですが未だ成功しません。また、他には3行目に for /D %%X in (*) do ( call :LOOP ) 改行 pause 改行 exit /b 改行 改行 :LOOP 改行 set DNAME="%%~X" と置き換えてみましたが、%~X自体が無効になってしまいました。ホント質問ばかりで恐縮なんですが、どうか叱咤ご鞭撻のほどよろしくお願いします。
111 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 12:29:40.60 ] DEL_(S,B)FARSTなんて言葉ないですね、デリート(スモール、ビック)FIRSTの意味です。それと >>103 ,>>104 ありがとうございます。さっそく使わせて頂きました。 何度も連投して申し訳ないのですが、もう少しの間だけお相手お願い致します。
112 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 13:48:37.77 ] > ドロップしたフォルダについては"タイトル"(&入り)だけ出来ませんでした。 パスにスペースが無くて&が入ってるとwinのドロップハンドラが""で囲まずにパスを送るからそうなる。winの仕様 例えばdirの結果から使うとか該当ディレクトリにcdしてfor(*)で受け取るとか別の方法考えたほうがいい どうしてもドラッグドロップから使いたいのなら%cmdcmdline%から引数を受け取るという方法があるけど これらのキーワードからどうすればいいか自分で思い付けないようであればやめといたほうがいい 簡単な解決策としてはパスにスペースを入れること c:\test\music以下にあるとしたらc:\test\X music X とか上位のディレクトリにスペース入れれば、「たぶん」問題なくなる > :DEL_SFARST > set DTITLE="%DTITLE:~2% > exit /b > :DEL_BFARST > set DTITLE="%DTITLE:~2% > exit /b 全く同じ処理してるんだからサブルーチン分ける必要ない echo %DTITLE%|findstr /r /c:"^. ." 1>nul if not errorlevel 1 ( call :DEL_SFARST ) echo %DTITLE% echo %DTITLE%|findstr /r /c:"^. ." 1>nul if not errorlevel 1 ( call :DEL_SFARST ) 私ならif "%DTITLE:~1,1%"==" " とかで判定してgotoでループさせるかな スペースひとつとは限らないし。位置も特定されたものを判定だから。 > )」をどこにおけば良いのか試行錯誤してるのですが未だ成功しません。 > for /D %%X in (*) do ( 改行 set DNAME="%%~X" いきなり本番書き上げようとせずにtest.batとか作って必要最小限で構文試せ echo が基本 for /D %%X in (*) do (echo "%%~X" せめてロジックを思い付けれるくらいにはコマンドの動作を理解したほうがいい。丸暗記する必要は全く無いが どんなコマンドがあるとかコマンドの説明書いてるサイトやリファレンスを一通り読んで コマンドごとに簡単なものを書いてみて、もう少し理解を深めることを勧める。forの中でしかfor変数は使えない
113 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 15:19:37.10 ] >>112 骨身に沁み入ります。善処します。 上位のディレクトリに"タイトル(&入り)"を挟んだところ、正常に処理が出来ました。 ラベルを同一にすればよかったのですね。そこまで気が回りませんでした。 >if "%DTITLE:~1,1%"==" "これならかなり絞り込めますね。 先のfindやifの流れから、練習問題として捉えてました。 正規表現に浮かれて盲目になっていたのもありますが、とても参考になりました。 しばらくgotoとforのサンプルをechoを使いながら見てみます。 身の丈に合わない早歩きで不愉快な思いをさせてしまい申し訳ありませんでした。 そしてご丁寧にどうもありがとうございました。
114 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 19:52:00.13 ] >>109 の3行目を下に置き換えたら成功しました。 また、簡単なものですがソートもさせてみました。 for /D %%X in (*) do ( echo "%%~X" set DNAME="%%~X" call :MAIN %DNAME% ) sort aaa.txt >bbb.txt del aaa.txt pause exit /b :MAIN echo %DNAME% rem ここまで rem 以下MAINの下から2行目を置換え echo "%DTITLE:~1,-1% 「Tab*2」 ¥%DNAME:~1,-1%" >>aaa.txt 次はタイトルが同じものだけをサブディレクトリに入れるような そーゆうコマンドに調整していこうと思います。 とりあえず一段落ついてホッとしました。サポートをして頂いた皆様に感謝します。 どうもありがとうございました。
115 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 20:56:39.36 ] > for /D %%X in (*) do ( > echo "%%~X" > set DNAME="%%~X" > call :MAIN %DNAME% > ) @echo off for /d %%X in (*) do ( call :MAIN "%%~X" ) pause exit /b :MAIN echo %1 exit /b callに引数付けてサブルーチンに送るならサブルーチンでは%1で受け取る call :MAIN "%%~X" "YY" "ZZ"とか複数送る場合は%1,%2,%3...となる @echo off for /d %%X in (*) do ( set DNAME="%%~X" call :MAIN ) pause exit /b :MAIN echo %DNAME% exit /b 環境変数にセットするならサブルーチンでも変数名で使える 用途に応じて使いやすいほうを。 set の文は末尾にスペースが入ったりする場合もあるから改行で終わるようにしたほうが無難 改行で終われない場合でスペースが入らない書き方が出来てるか確認するには echo %DNAME%%DNAME% とかで二つ重ねてechoしてみればわかる
116 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 22:48:56.39 ] sortはリダイレクトでファイルに出力した場合は 自分自身をソートするという使い方は出来ないけど /o で出力した場合は自分自身もソートできる。 リダイレクトして元ファイルを削除するなんて事をしなくてもいい。
117 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 23:09:11.12 ] ソートはしらなんだ
118 名前:デフォルトの名無しさん mailto:sage [2011/10/08(土) 23:12:00.92 ] type aaa | find "aaa" | sort /+1000000 /o aaa
119 名前:デフォルトの名無しさん [2011/10/10(月) 06:31:34.40 ] カーナビのmp3の再生順序が、ファイル名や更新日時などではなく FATテーブルに書き込まれている順序で再生されるのですが、 この並び順を変える良い方法はありませんか?
120 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 08:15:04.51 ] 一昨日のあれから"タイトル"が重複するフォルダの移動に取り掛かっているのですが 全くうまくいかずに心が折れました。色々試したつもりではあるのですが… もしよろしければ、次に何をすべきか、どう組み立てるべきかご教示願えないでしょうか? >>90 さんに紹介頂いた配列変数や、>>115 さんに教えて頂いたcall :ラベル 複数→%1,%2%3 これを活用できないかと考えてはみたのですが、私の力では想像が足りませんでした。 せっかく紹介して頂いたのに申し訳ありません。 どうか智慧をお貸し下さい。お願いします。
121 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 10:05:15.18 ] >>120 結局どうしたいの? 重複がわかりやすくなって簡単な方法であれば フォルダ名を "[レーベル] タイトル (ジャンル)"→"タイトル [レーベル] タイトル (ジャンル)" とか元のフォルダ名の前にタイトル追加すれば綺麗に並ぶ "タイトル"tab"ディレクトリパス" とテキストにリスト化することだって出来るし ディレクトリを "\タイトル\[レーベル] タイトル (ジャンル)\" と タイトルフォルダ作ってそこへコピーすることだって出来る それに重複「だけ」にこれらの操作を適用するのか全てのディレクトリに適用するのかとか (もちろん面倒なのは「重複だけ」の方) 全てに適用でタイトルフォルダへコピーなら タイトルを比較する必要もなくなる 前にも書いたけど厳密に比較でなく乱暴でよければ dirの結果を"タイトル"でfindしてその結果を"タイトル"フォルダへコピーとかなら 全ての対象フォルダからタイトル抜いて配列orリスト.txtにして"タイトル"を比較とかしなくて済む 方法なんていくらでもあるしやろうと思えば出来るから。 ただ、あなたがどうしたいかによってやり方や難易度は全然変わってくるので どういう動作をさせる&させたいのかはっきりしてくれないとこの先はアドバイスしようがないよ
122 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 10:14:30.08 ] >>119 それがわかってるなら再生させたい順で転送しなおせば? あとそれってバッチは関係あるの?
123 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 10:33:58.09 ] >>121 様々なプランを提示して頂いてありがとうございます。 具体的にやりたい事は、C:\test\juu fuku\ここでbatを実行し この階層にある全てのフォルダ(フォルダネームは弄らない方向で)を対象に タイトルが重複するものだけを、C:\test\juu fuku\該当\に移動できるようしたいと思ってます。 面倒になってしまい恐縮ですが、ひとつよろしくお願いします。
124 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 21:13:00.51 ] 1つ目の方法 titlelist.txtに"C:\test\juu fuku"配下のフォルダを対象に"タイトル" "フォルダ名"書き出し titlelist.txtから"C:\test\juu fuku\該当"の行を削除 ここからループ処理 titlelist.txtから1行目が読み込めなければ終了処理 titlelist.txtから1行目の"タイトル"を読み込んで find /c """タイトル""" "titlelist.txt" 結果が1ならtitlelist.txtから1行目を削除してループに戻る 結果が2以上ならfind """タイトル""" "titlelist.txt"の結果をforで2番目のtoken抜き出して"フォルダ名"を順に取り出し move "C:\test\juu fuku\フォルダ名" "C:\test\juu fuku\該当\フォルダ名" titlelist.txtから"タイトル"の行を削除してループに戻る 2つ目 一度全てのフォルダを"C:\test\juu fuku\該当\タイトル\フォルダ名"とする "C:\test\juu fuku\該当\"でdir /ad /bとかで"タイトル"フォルダ名を forで順に取得してdirで"タイトル"フォルダ配下のフォルダ数を判定 "タイトル"フォルダ以下にフォルダがひとつであれば "C:\test\juu fuku\フォルダ名"へ移動 ふたつ以上ならそのまま 上の処理が終わったら"C:\test\juu fuku\該当\タイトル\フォルダ名"を "C:\test\juu fuku\該当\フォルダ名"へと移動して終了 他にも方法はいくらでもあるだろうけどとりあえずこんなところかな。 2つ目の方が簡単だけどコピーする数増えるしコピーで壊れる確率も増える ベリファイする処理混ぜるとかコピーに>>106 が言ってたfirefilecopy使ってベリファイするとかすればいい 自分で無理そうならこちらへ 気軽に「こんなソフトありませんか?」 Part.141 hibari.2ch.net/test/read.cgi/software/1315320625/ ◆こんなソフトウェアつくってください〜Part16〜◆ hibari.2ch.net/test/read.cgi/software/1316551791/
125 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 22:12:28.47 ] > 2つ目 > 一度全てのフォルダを"C:\test\juu fuku\該当\タイトル\フォルダ名"とする "C:\test\juu fuku\TMP\タイトル\フォルダ名" とかのほうがいいな 一旦全てを"C:\test\juu fuku\TMP"へ移動 そこから "C:\test\juu fuku\Not juufuku"と"C:\test\juu fuku\該当"へ振り分ける感じで まあ処理がわかりやすくなれば分けるフォルダ名はなんでもいいよ
126 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 00:02:59.36 ] 質問者は >>80 を見るとバッチファイルにこだわっているわけではないようだし テンプレにも「※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。」とあるように 他の言語を使ったほうがいいんじゃないか? そもそもバッチファイルによる高度なプログラミングは初心者向きではなく、職人芸みたいな感じだし
127 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 00:05:54.23 ] >>124 ,>>125 ,>>126 ありがとうございます。挑戦させて頂いたのですが またもや分からない点が溢れだしました。 しかし、これ以上私のレスでここを埋めてしまうのも忍びないので 一度、誘導して頂いたスレッドで依頼してみます。 ただ、並行して1つ目は理解できるよう挑戦していきたいと思います。 それとWSHについてもROMってみるとよく話題にのぼっているので 私も調べてみます。どうもありがとうございました。
128 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 15:45:30.09 ] 自分も>>101 を試してみようとそのままbatにしてみたのですが echo %DNAME%|find "(" 1>nul find: invalid expression; expected to find a ')' but didn't see one. Perhaps you need an extra predicate after '(' このように表示されてしまいました。 おそらく自分だけ?だと思うので何か環境がまずいのだとは思うのですが 何がまずいんでしょうか?winXPを使ってます。
129 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 16:44:47.21 ] find/? where find
130 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 17:24:09.98 ] >>129 find /?さえ開けない・・・ コマンドプロント開いて%PATH%打ったらどう表示されますか? 多分ここが違うものに変更されて出来なくなったのかなぁ
131 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 17:54:01.17 ] for %I in (find.exe) do echo %~$PATH:I
132 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 18:09:54.10 ] >>131 実行したら C:\Ruby192\bin\find.exe になりました。Ruby192は今日インストールしたやつです。 これからどうすればよいのでしょうか?
133 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 18:43:25.57 ] >>129 where findってそーゆうことだったんですか てっきり英語で聞いてるのかと思ってました、ごめんなさい。 where find C:\Ruby192\bin\find.exe C:\Windows\System32\find.exe これ2つあるからRuby192の方のfind.exe削除しちゃって大丈夫ですかね? 削除しようとしても削除できなったんですけども。 とりあえず環境変数PATHの並び順をRubyの方を%SystemRoot%の後にしてみたら とりあえずうまくいきました。これで問題ないですかね?
134 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 18:44:40.72 ] そもそもなんでrubyの方が前に来てるんだよ
135 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 18:53:36.18 ] 別にPATHに頼らんでも C:\Ruby192\bin\find.exe C:\Windows\System32\find.exe で好きなほうが使えるだろw そんなことも知らなかった?
136 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 19:16:28.07 ] >>134 なんかインスコする時PATHがどうこうチェックしたったら前になったったった >>135 知らないボクに教えて下さい><どうやるんです?
137 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 19:19:35.88 ] > 自分も>>101 を試してみようとそのままbatにしてみたのですが おまえ>>127 だろ?なんで別人のフリしてんの? hibari.2ch.net/test/read.cgi/software/1316551791/88-98
138 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 19:24:39.25 ] >>137 そのスレで知って来たんですけど別人です
139 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 19:31:12.09 ] そもそもRuby入れてどうするのさ
140 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 19:40:25.44 ] >>139 なんか色々使いまわしできそうなフリーソフトの内容だったから自分も欲しくなって。 Rubyのソース貼ってあったしちょっとやってみようかなと入れて見ました。
141 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 19:45:44.76 ] >>136 >>135 に書いてあるだろボケ
142 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 19:56:13.96 ] バッチも使えないのがRubyなら使える?
143 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 20:49:01.35 ] >>140 人のマネするなら真摯な受け答えと学習の姿勢も見習った方がいいぞ。
144 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 21:22:07.29 ] >>143 > 学習の姿勢も見習った方がいいぞ。 誰を見習うの?>>127 のことを言ってるのならあいつ学習なんてしてなかったと思うが。 あいつが動かないって言って貼ったやつ見たらほとんど試してねーのまるわかりじゃん。 教えたがりのバカもほどほどにしろよと。 hibari.2ch.net/test/read.cgi/software/1316551791/88 > 途中までbatで皆様の助けを得ながら作りましたので > "タイトル"の抜き出しまでですが とか言ってるけど>>101 と>>103 がまるまる書いたんじゃねーかよw
145 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 22:03:54.50 ] まあ、重複を調べるなら初めから他の言語で教えたほうが良かったんじゃとは思う
146 名前:デフォルトの名無しさん mailto:sage [2011/10/12(水) 00:01:52.28 ] >>144 本当にその通りだと思います。言葉の綾にしても酷すぎました。 >>101 さんと>>103 さん、申し訳ありませんでした。 そしてもう一度、ありがとうございました。 また、お陰様で依頼の品を作って頂く事が出来ました。 紹介して頂いた>>124 さんありがとうございました。 最後に、今までの長きに渡りご指導を頂きました皆様に感謝します。 無知な私に時には厳しく、時には易しく教示して頂いた事を忘れず これらも精進していけたらと思います。本当にありがとうございました。 それでは失礼します。 スレをかき乱してしまい申し訳ありませんでした。
147 名前:デフォルトの名無しさん mailto:sage [2011/10/12(水) 23:36:51.13 ] rem >>114 のpauseに下記を代入 md "[重複フォルダ]" set DPATH="%~dp0" for /f "delims=, tokens=1,2" %%i in (bbb.txt) do call :sub %%i %%j for /f "delims=," %%k in (ccc.txt) do call :last "%%~k" del bbb.txt&del ccc.txt rem >>110 の最後に下記を挿入 :sub set DNAME=%2 for /f "tokens=1-3" %%a in ('find /c ""%1"" "bbb.txt" ^|find "-"') do ( if %%c==2 echo "%DNAME:~1,-1%",>>ccc.txt ) exit /b :last set DMOVE=%1 move "%DPATH:~1,-1%%DMOVE:~1,-1%" "%DPATH:~1,-1%[重複フォルダ]\" pause exit /b これで重複フォルダのみを移動する事ができました。 教えて頂いたせめてもの誠意として、完成品を書きました。 他にも欲しいとおっしゃる方がいましたので、もしよろしければ使ってみて下さい。 本当は>>124 さんに教えて頂いたものをそのまま書きたかったのですが 私の力では理解が足りず、再現することが出来ませんでした。しかし、大変為になるロジックばかりで このコマンドを作成するにあたり大変お世話になりました。改めてありがとうございました。 それでは失礼しました。
148 名前:デフォルトの名無しさん [2011/10/12(水) 23:50:38.95 ] 192.168.0.1という文字列を引き渡して、最後の1だけを254に 置き換えたいのですが、どうやったらできますでしょうか? forを使ってやってみたのですが、うまく置き換えられません。 よろしくお願いします。
149 名前:デフォルトの名無しさん mailto:sage [2011/10/12(水) 23:51:22.22 ] >>147 動かないです><
150 名前:デフォルトの名無しさん mailto:sage [2011/10/12(水) 23:56:17.44 ] >>148 set a=192.168.0.1 echo %a:~0,-1%254
151 名前:デフォルトの名無しさん mailto:sage [2011/10/13(木) 00:03:12.90 ] >>149 すいません、忘れてました。>>109 のpauseに下記を代入してください。 echo "%DTITLE:~1,-1%","%DNAME:~1,-1%">>aaa.txt これで多分大丈夫だと思います。
152 名前:デフォルトの名無しさん mailto:sage [2011/10/13(木) 00:20:07.61 ] set a=192.168.0.1 set b=254 for /f "tokens=1,2,3,* delims=." %%A in ("%a%") do set c=%%A.%%B.%%C. echo %c%%b% pause exit /b
153 名前:デフォルトの名無しさん [2011/10/13(木) 22:35:06.20 ] >>148 これだと一桁しかダメでした。説明不足ですみません。 >>152 うまくいきました!ありがとうございました。
154 名前:デフォルトの名無しさん mailto:sage [2011/10/14(金) 19:58:12.44 ] set a=!?-,.、。!?〜ー☆#♪ for %%x in (! ? - , . 、 。 ! ? 〜 ー ☆ # ♪)do call set a=%%a:%%x=%% echo %a% このようにすると「,」と「?」が残ってしまうのですが その2つも消すにはどうすればよいのでしょうか? また、これは一体何が原因なのでしょうか?
155 名前:デフォルトの名無しさん mailto:sage [2011/10/14(金) 20:12:15.64 ] エスケープされてないので ,は空白に置換 ?は1文字ファイル名に置換
156 名前:デフォルトの名無しさん mailto:sage [2011/10/14(金) 23:12:48.73 ] >>155 最初のsetを""で囲んでforのセットに^?^,でいけるかなと思ったんですが駄目でした。 他も色々と試してみたのですが、うまいことエスケープ出来ませんでした。 forの外ならset a=%a:?=%とset a=%a:,=%でエスケープもいらないのですが 仕組みを理解したいのでもうちょっと調べてみます。よく分かりませんが。 ありがとうございました。
157 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 00:55:29.25 ] set a=!?-,.、。!?〜ー☆#♪ for %%x in (! ^^? "?" - "," . 、 。 ! ? 〜 ー ☆ # ♪ ') do call set a=%%a:%%~x=%% echo %a% set a=%a:?=% echo=%a% pause forの()中 ?は "?"はダメで ^^?でエスケープ出来るが %%xに渡してくれない カレントディレクトリに1文字のファイル置けば一応エスケープされてることが確認できる
158 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 01:40:23.71 ] ?はエスケープでけん
159 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 07:59:56.29 ] >>147 for /d /r c:\test %a in ("*タイトル*") do @echo %a
160 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 09:06:03.07 ] >>157 、>>158 ファイル名に使えない=\|/:*<>は試してませんが (! ^ ! ? ☆ ★ ♪ # # $ $ 〜 − ― < > ー - "," " " " " . ・ 「 」 → 、 ” ’ 。 _ & + / \ ・ + "&" % @ @) do なんかは普通に通りました。後は遅延を考慮した""%%""位が特殊な形でした。 危険そうな所は避けているので他にもあるとは思いますが…これらは成功しました。 それでようやく理解しかけているのですが、例えば?と同じく出来なかった%の置換。 doの遅延で2つで1つ状態なので、セットの段階から%%にして、これに他と同じく ""を付けるのですが、他は%%~xで""を外しても大丈夫だったのですが これは""を外して置くと特殊文字化するので、再びここで囲み直し 結果的に""%%""と二重で囲んで成功しました。 これは?にも当てはまって、""?""これで無効化された普通文字というのでしょうか おそらく他もこの仕組みなんだろうと思いました。^自体は^^でした。 アドバイスのおかげで成功出来ました。どうもありがとうございました。
161 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 09:18:12.11 ] >>159 forはある程度理解できるようになったと思っていたのですが、全然浅かったです。 ありがとうございます。解読して挑戦してみます。まだgoto文が苦手なんですよね。 おそらくgoto文も使うのでちょっと腰を据えて学んでみます。ご紹介ありがとうございました。
162 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 14:22:35.26 ] set a=%%%!?-,. echo %a% for /f %%a in ('echo "%a%"') do @echo %%~a for /f %%a in ('echo %a%') do @echo %%a for /f %%a in ("%a%") do @echo %%a pause 面白いなw
163 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 14:34:34.66 ] hibari.2ch.net/test/read.cgi/tech/1298873550/32 32 名前:デフォルトの名無しさん[sage] 投稿日:2011/03/09(水) 04:52:28.96 setlocal enabledelayedexpansion set o=me set me=de set de=to set to=u set u=omedetou set omedetou=^^^>^^^>31 説明しても良いが、何故かもう一回展開できてしまって、この理由が全く説明できないから、展開されるタイミングとか勘違いしてるかもしれんが良いか? for /f %%A in ( 'call echo %%%%!%o%!%%%%' ) do call echo %%!%%A!%% endlocal
164 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 14:44:44.95 ] >>162 どこが?当たり前だのクラッカだが?
165 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 14:48:55.47 ] hibari.2ch.net/test/read.cgi/tech/1298873550/45 45 名前:デフォルトの名無しさん[sage] 投稿日:2011/03/09(水) 22:13:30.35 >>43 んじゃ、このバッチで復習を setlocal enabledelayedexpansion set o=me set me=de set de=to set to=u set u=omedetou set omedetou=おめでとう for /f %%A in ( 'call echo %%^^^!%%%%!%o%!%%%%^^^!%%' ) do call echo %%A endlocal
166 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 14:54:44.85 ] つまらん もちっと珍しいことはないのか?
167 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 15:28:12.86 ] ここを見てると、「(PerlやRubyのような)フリーソフトは危ないから導入禁止」 とかほざいてる馬鹿会社が、いかに罪深いかがよく分かるな。 まあ趣味でバッチを追究するのは、また別の話だが…
168 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 15:41:20.39 ] >>164 いや、ファイル名に%が付いてるのはどうなるかなと思ってね たいした意味はないよ
169 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 15:44:12.87 ] べつにちっともこまらんが? あるものを使いこなせない馬鹿社員が、いかに罪深いかがよく分かるな。
170 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 15:47:22.16 ] >>169 暇な窓際社員は呼んでない
171 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 17:46:30.61 ] forのfile setでは?はエスケープできないね でもfor/fなら?が渡せるよ scripting.cocolog-nifty.com/blog/2008/11/lf-7446.html の要領でfor /f in (複数行)にすればよい
172 名前:デフォルトの名無しさん mailto:sage [2011/10/16(日) 15:19:28.43 ] 亀レスだけど>>36 これ凄いな・・・職人芸を感じる。 他の言語知らないから普通の事かもしれんが
173 名前:デフォルトの名無しさん mailto:sage [2011/10/16(日) 16:17:39.50 ] set a=!?-,.、。!?〜ー☆#♪ set b=! ? - , . 、 。 ! ? 〜 ー ☆ # ♪ for /f %%x in ('echo %b: =^&echo %') do call set a=%%a:%%x=%% echo %a%
174 名前:デフォルトの名無しさん mailto:sage [2011/10/16(日) 17:13:39.45 ] set a=!?-,.、。!?〜ー☆#♪ set b=! ? - , . 、 。 ! ? 〜 ー ☆ # ♪ for /f %%x in ('"echo %b: =&echo %"') do call set a=%%a:%%x=%% echo %a%
175 名前:デフォルトの名無しさん mailto:sage [2011/10/16(日) 17:34:19.64 ] 何か云えよw
176 名前:デフォルトの名無しさん mailto:sage [2011/10/16(日) 17:35:27.55 ] 何か
177 名前:デフォルトの名無しさん mailto:sage [2011/10/16(日) 17:37:14.47 ] これ凄いな・・・職人芸を感じる。
178 名前:デフォルトの名無しさん mailto:sage [2011/10/16(日) 22:56:12.18 ] >>167 windows鯖いじる仕事だったら普通だけど、、 まあ、本番で使ってるのはもっとシンプルなバッチばっかりだけどな。
179 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 05:53:06.23 ] 2>nul "%cd:\="&set "HIRAGANA=%" これなにをやってるの?さっぱりわからない…
180 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 11:34:00.25 ] set dir=G:\ほげ1\ほげ2\ set dir=%dir:~0,-1% 2>nul "%dir:\="&set "target=%" echo %target% pause フォルダ名を取得してるんじゃない
181 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 15:36:37.01 ] %~nxIを使えば済むところを物好きな
182 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:13:38.98 ] >>181 %~nxIだとカレントディレクトリ名でなく、そこにあるフォルダ名になると思うんだが
183 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:22:55.35 ] 置換の方がfor使って書くより単純だけどな。 ちなみに最後の文字が\だと%~nxiもNGだからね…
184 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:28:36.69 ] あたま悪いの?
185 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:35:08.24 ] >>184 頭悪い本人乙
186 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:35:29.48 ] >>184 あたま良いの?なら書いてみてよ
187 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:36:36.04 ] for %%I in ("%~dp1.") do set HIRAGANA=%%~nxI より cd /d "%~dp1" 2>nul "%cd:\="&set "HIRAGANA=%" とは物好きな
188 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:37:04.21 ] まあ待て。本人は頭がいいと思ってるのかもしれないけど、 知らない方がいいってこともある。
189 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:40:29.12 ] どっからcdなんて出てきたと思ったらえらい昔のレスじゃないか… 安価付けろボケ
190 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:48:52.08 ] ボケはおまえだけだが?
191 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 16:51:22.28 ] >>187 これ凄いな・・・職人芸を感じる。
192 名前:デフォルトの名無しさん mailto:sage [2011/10/17(月) 17:11:58.24 ] >>191 もう許してやれよww