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/
401 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 11:18:02.60 ] batファイルからカラーダイアログを呼び出せることって無理ですか?
402 名前:397 mailto:sage [2011/12/29(木) 00:13:43.43 ] >>398-400 ループ処理が難しそうですが、なんとかできそうです。 ありがとうございました。
403 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 02:26:05.21 ] mshta "about:<script>function b(){new ActiveXObject('Scripting.FileSystemObject' ).GetStandardStream(1).Write(d.ChooseColorDlg().toString(16));close();}</script> <body onload='b()'><object id='d' classid='clsid:3050f819-98b5-11cf-bb82-00aa00b dce0b'></object></body>"|more
404 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:14:43.54 ] 【質問】 ・1-18までカウントしていく関数(サブルーチン?)を作りたいです。 調べて自分なりに試しているのですが、上手くいかずに行き詰ってしまいました。 下記のように、1-9までは01-09のように0を付加して表示したいです。 01/18 処理結果 02/18 処理結果 【 OS 】 ・Windows XP Professinal SP3 【構文】 SET /A CNT = 1 SET /A IND = 18 CALL :ZERO %CNT% :ZERO IF "%1" LEQ "9" ( SET /A DD = %1 SET /A DD += 100 SET /A ABC = %DD:~-2% ECHO %DD:~1,2%/%IND% SET /A CNT+=1 ) EXIT /B よろしくお願いします。
405 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:07:34.22 ] > 1-18までカウントしていく関数(サブルーチン?)を作りたいです。 仕様がよくわからん。18超えたらどうするの? 01,02,03,・・・17,18とechoさせたいわけじゃないよね? 処理結果とあるけど、別の処理をループさせてのカウントかな? だとすればわざわざサブルーチンにしなくても set CNT=101 で101-118をカウントして %CNT:~-2% で表示させればいい @echo off set CNT=100 :loop set /a CNT+=1 echo %CNT:~-2%/18 echo 処理結果 if not %CNT%==118 goto :loop pause
406 名前:450 mailto:sage [2012/01/05(木) 18:39:55.01 ] >>405 レスありがとうございます。 教えていただいた方法でできるようになりました。 どうもありがとうございました! SQLiteのVACUUMとREINDEXのバッチ作成の際に、01/18: ファイル名.拡張子 と表示して、 現在何個あるうちの何番目を処理中かどうか、というのを表示させたく作成中でした。 その際に、1-9までについては先頭に0を付加したかったのですが、書式的なもののやり方 が分からずにいました。 ※1/18ではなく、01/18のように。 【バッチ内容】 SET ADDONS = addons.sqlite SET /A CNT = 100 SET /A IND = 18 CALL :loop %CNT% %ADDONS% REM ここに 01/18: addons.sqlite と表示させたい。 sqlite3.exe ..\..\%ADDONS% VACUUM sqlite3.exe ..\..\%ADDONS% REINDEX :loop SET /A CNT += 1 ECHO %CNT:~-2%/18: %2 EXIT /B 【希望結果内容】 01/18: addons.sqlite
407 名前:404 mailto:sage [2012/01/05(木) 18:43:23.40 ] >>404 です。 >406の名前欄が間違っていました。 失礼しました。 ※教えていただいてできたので良かったのですが、 >>404 でなぜうまく動作しないのか謎でモヤモヤが。 どうもありがとうございました。
408 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:09:16.86 ] >>407 if "12" leq "9" echo 文字列の比較は一桁目から
409 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:11:30.07 ] ×一桁目 ○左
410 名前:デフォルトの名無しさん mailto:sage [2012/01/08(日) 22:31:16.99 ] コマンドプロンプト上で for /L %i in (1,1,10) do @(set /a 123) とやると 123123123123123123123123123123 と改行挟まずに出力されるんですが、これのメカニズムを誰か説明してください。
411 名前:デフォルトの名無しさん mailto:sage [2012/01/08(日) 22:46:19.69 ] set が改行を剥いでいるんじゃね。 set /P とかで、入力は改行で終了するだろうけど、結果には改行が入っていない方が便利だし。
412 名前:デフォルトの名無しさん mailto:sage [2012/01/08(日) 23:14:53.08 ] setが改行を出さないだけだろ
413 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 19:02:34.30 ] :loop execcommand sleep 600 goto loop というループがあって 真ん中あたりでユーザーがその挙動を変えられるようにしたいんだけど 何も入力がなければループを妨げない、 入力があったらキーを set key=? して call :setoption するにはどうすればいいでしょう。
414 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 19:47:08.87 ] >>413 www.vector.co.jp/soft/dos/util/se053514.html こういうツール使うとか これがまともに動くかどうかわからないから試してダメだったら 似たようなの探すか、作って配布してくれ
415 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 20:36:27.20 ] choice/?
416 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 22:04:41.80 ] tomeout/?
417 名前:デフォルトの名無しさん [2012/01/12(木) 22:42:42.89 ] treeを入れるとそのディレクトリのファイルをツリー形式で出力されますが これに加えてファイル名+サイズ名+最終更新日を出力したいのですが可能でしょうか?
418 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 23:00:03.63 ] dir /s を整形するとか。。めんどくさそうだけど。
419 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 23:03:13.11 ] vbs とかで作った方が楽かと。
420 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 23:18:18.22 ] バッチでは?
421 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 01:17:12.05 ] ttp://www1.axfc.net/uploader/Sc/so/309130.jpg ttp://www1.axfc.net/uploader/Sc/so/309131.zip こんなのどう 普通にtreeするのに比べるとめちゃくちゃ遅いけど 表示のスタイルは tree /a /f を参考に ファイルの表示は dir /a-d /t:w を行ごとに
422 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 05:19:27.39 ] >>417 www.vector.co.jp/soft/win95/util/se247619.html
423 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 06:58:49.41 ] >>422 スレチ
424 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 15:57:19.14 ] >>415-416 choiceはできそうだけど、timeoutはどう判定すんだ?
425 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 17:00:32.46 ] むりぽ
426 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 22:16:52.32 ] 画面で区別できんだからバッチでもできるっしょ
427 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 02:31:56.51 ] だめぽ
428 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 00:23:57.26 ] %1に渡したファイルやフォルダがルートにあるのかどうかを判定するのってどう書けばいいですか? %~1が3文字だったら、とか思いついたけどもっと上手い方法だったり定石があるなら教えてください
429 名前:428 mailto:sage [2012/01/15(日) 00:25:03.61 ] 訂正します > %~1が3文字だったら %~dp1が3文字だったら
430 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 00:36:58.61 ] UNCとかにも対応したいなら set a=%cd% push .. set b=%cd% popd して比較するとか
431 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 01:41:37.76 ] "%~p1" == "\" だとダメなの?
432 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 09:17:31.43 ] >>430 ありがとうございます UNCのことはすっかり失念していました cdでUNCはカレントに出来ないと言われて困りましたけど pushd "%~dp1" で勝手にネットワークドライブの割り当てをやってくれて カレントディレクトリを移すことが出来ました >>431 それでよかったですよねありがとう pushd "%~dp1" if exist "%cd%\%~nx1" (call :ROOTEXP "%cd%\%~nx1") else echo ファイル見つからない pause exit :ROOTEXP echo "%~1" echo "%~dpnx1" if "%~p1"=="\" (echo ルートディレクトリにあるよ) else echo ルートじゃないよ exit /b 一応、これで意図した動作になりました ルートにあるファイルやフォルダの場合、echo "%~1" がZ:\\test.txt のように\\となるのですが 正常に動いてるみたいですし、"%~dpnx1"で正しいパスは取れるのですが この書き方で問題が出るケースはありますでしょうか?
433 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 20:29:01.37 ] 空きメモリか使用メモリを標準出力でゲットするコマンドないですか。 memはさすがに消滅していたw
434 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 21:04:49.82 ] wmic
435 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 00:29:25.23 ] tasklistの各行の出力結果を合計してみるとか
436 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 03:38:43.26 ] それはねーよ
437 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 12:21:08.71 ] wmic調べてみます。ありがとうございました。
438 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 12:27:17.34 ] wmic os get freephysicalmemory
439 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 17:08:24.54 ] for /f %%i in ('wmic os get freephysicalmemory') do set x=%%i echo %x% ECHO は <ON> です。
440 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 17:35:24.25 ] for /f "eol=F" %i in ('wmic os get freephysicalmemory') do echo %i
441 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 17:49:41.37 ] ECHO は <ON> です。
442 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 21:14:43.83 ] for /f "skip=1" %i in ('wmic os get freephysicalmemory') do if not defined mem set mem=%i echo %mem%
443 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 23:58:50.04 ] for /f %i in ('wmic os get freephysicalmemory') do (call set x=%i) & if defined x call set mem=%i echo %mem%
444 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 03:36:44.19 ] 'wmic' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
445 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 14:12:06.16 ] Windows 2000以降のOSではWMIが標準で実装されている Windows 2000にはwmic.exeは用意されていない
446 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 15:37:33.32 ] それを言うならXP以降だろw 以降はそれも含むんだから
447 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 18:17:43.40 ] win2kはwmiコンポーネント実装済みだけどwmicは同梱されていないって事じゃね?
448 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 19:55:57.58 ] それを言うなら>>446 阿呆だろw
449 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 00:35:34.90 ] xp homeはwmic入ってないのか
450 名前:デフォルトの名無しさん [2012/01/22(日) 15:35:57.54 ] D:\MUSIC\(複数アーティスト)\(各々に複数アルバム)\Resize\Folder.jpg という階層で Folder.jpgを1つ上のディレクトリに上書き移動して、Resizeフォルダを削除したいのですがうまくできません。 ご教示いただけないでしょうか、一所懸命初めてバッチ書いてみましたがたぶん見当はずれです cd /d D:\MUSIC for /d %%A in (*) do ( cd %%A for /d %%B in (*) do ( cd %%B\Resize move /y Folder.jpg ..\Folder.jpg cd .. rd /s /q Resize ) )
451 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 16:36:07.61 ] >>450 cd /d d:\music dir /a-d /b /s Folder.jpg >list_fjpg.txt dir /ad /b /s Resize >list_Resize.txt 処理するファイルが上のリストで問題ないようならこれで出来ると思う for /f %%a in ('dir /a-d /b /s Folder.jpg') do move "%%~a" ".." for /f %%b in ('dir /ad /b /s Resize') do rd /s /q "%%~b" Resizeフォルダ以外にもFolder.jpgがあって上のがダメなら dir /a-d /b /s Folder.jpg|findstr /e /l /i "\Resize\Folder.jpg" >list_fjpg.txt これでたぶん大丈夫だと思うけど試してダメだったらfindstrのオプションとか工夫してみて
452 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 16:36:27.77 ] cdをpushdやpopdに変えて試してみてね
453 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 16:49:17.51 ] >>450 cd /d "D:\MUSIC" for /d /r %%a in (*) do ( pushd "%%a" call :movejpg "%%~na" popd ) goto :eof :movejpg if not "%~1" == "resize" (if not "%~1" == "Resize" goto :eof) move Folder.jpg ..\ cd ..\ rmdir resize goto :eof
454 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 16:51:54.76 ] jpgを拾うようにした自前のものがよく似ていたので1行目だけ編集したのを貼ってみる。 cd /d D:\MUSIC for /r /d %%i in (*) do ( if exist "%%i\resize" ( move "%%i\resize\*.jpg" "%%i" rd /s /q "%%i\resize" ) ) 趣旨が違うかもしれないが。
455 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 18:06:41.19 ] >>454 のを少し弄って cd /d D:\MUSIC for /r /d %%i in (*) do ( if exist "%%i\resize\folder.jpg" (move /y "%%i\resize\folder.jpg" "%%i"&&rd /s /q "%%i\resize") ) これで質問者の要求仕様を満たすんじゃね?
456 名前:450 [2012/01/23(月) 09:47:50.42 ] みなさんありがとうございます! せっかくなので環境をコピーして4つとも試してみましたがどれもうまくいきました! バッチファイルが綺麗に完走するのってピタゴラスイッチ的な爽快感がありますね
457 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 13:55:01.20 ] 2chブラウザのkakikomi.txtを自動で編集して、 日付データと本文部分だけを残すというbatファイルをつくりました find /v "Subject:" <kakikomi.txt >kakikomi2.txt find /v "URL :" <kakikomi2.txt >kakikomi3.txt find /v "From :" <kakikomi3.txt >kakikomi4.txt find /v "Mail :" <kakikomi4.txt >kakikomi5.txt というゴリ押しで一応目的は達成できたのですが、時間もかかるし無駄が多い気がします もっとスマートな書き方もあるのでしょうか? kakikomi.txt内の書き込みデータは、 -------------------------------------------- Date : 2012/01/01 00:00:00 Subject: スレッドタイトル URL : ... From : Mail : 本文 -------------------------------------------- のくり返しになっています
458 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 14:34:47.86 ] findstr/?
459 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 14:37:22.65 ] findstr /b /v "Subject: URL FROM MAIL" "kakikomi.txt" >"kakikomi2.txt" 本文の行頭に同じ文字列があったらその行も消えるけど>>457 よりはマシと思う
460 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 14:49:55.56 ] >>459 ありがとう!次回からは書いてくれたものを使ってみます
461 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 23:44:16.41 ] フォルダ内のtest*.batを順に実行したいのですが、10回callする毎に標準出力に メッセージを出したく思います ↓を実行すると毎回echoが実行されてしまうのですがどう修正すべきでしょうか? set /a N=1 for /F %%a in ('dir .\test*.bat /b') do ( call %%a set /a N = %N% + 1 if "%N%"=="10" do ( echo ---------- set /a N=1 ) )
462 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:15:29.97 ] >>461 echo onで実行されたバッチがどうなってるか見りゃわかるけど… 遅延環境変数でググってみ。
463 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:56:33.67 ] for /f %%a in ('dir /b test*.bat') do ( call %%a call :COUNT ) pause&exit :COUNT set n+=1 if %n%==10 (echo ----------&set n= ) exit /b
464 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:59:13.37 ] > set n+=1 set /a n+=1
465 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 09:22:44.38 ] 遅延環境変数のことを失念していました(ノ∀`) サンプルまで書いていただいてありがとうございます
466 名前: 忍法帖【Lv=5,xxxP】 mailto:sage [2012/01/28(土) 20:05:08.71 ] Vista/7などで環境変数を永続的に変えるのってCUI(cmd)じゃできないんですか? 95とかならexec.batをいじるとできるそうですがいい方法無いですかね マウスでカチカチみんな設定してるの?
467 名前: 忍法帖【Lv=5,xxxP】 mailto:sage [2012/01/28(土) 20:06:15.39 ] Vista/7などで環境変数を永続的に変えるのってCUI(cmd)じゃできないんですか? 95とかならexec.batをいじるとできるそうですがいい方法無いですかね マウスでカチカチみんな設定してるの?
468 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 20:08:12.26 ] setx
469 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 20:37:47.45 ] autoexec.batだろ
470 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 20:50:34.72 ] >>467 GUIだけどキーボードだけで設定ダイアログまで行けるぞ Windowsキー → 「環境変数」と入力 → 上に「環境変数の設定」が出て来たらEnter
471 名前: 忍法帖【Lv=5,xxxP】 mailto:sage [2012/01/28(土) 21:30:25.20 ] Vista/7などで環境変数を永続的に変えるのってCUI(cmd)じゃできないんですか? 95とかならexec.batをいじるとできるそうですがいい方法無いですかね マウスでカチカチみんな設定してるの?
472 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 21:43:58.44 ] >>469-471 >>468 で完璧な回答が出てるのに… メクラ?
473 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 22:00:05.37 ] exec.batってなんだよ
474 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 22:02:10.08 ] >>472 自分で調べる気がないってことでしょ。 スルーでいいよ。
475 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 22:33:43.17 ] コンソールで使える日本語TTフォントはMSゴシックしかないの?
476 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 00:12:38.08 ] fixed98epsonマジオススメ
477 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 20:37:29.16 ] 標準で入ってるものではMSゴシックだけ?
478 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:41:10.62 ] レジストリいじれば好きなTTフォント使える。 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont でググれ
479 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:41:35.10 ] ほんとかよ 使えなかったが?
480 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 23:24:15.61 ] 俺は使えてる、XP x64。 レジストリ微妙に何か間違ってるか、プロンプトを間違えているとか? 64bit OS で 32bit の cmd.exe を常用してる? ↓が『64bit OS で 32bit の cmd.exe 』の場合 HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
481 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 23:27:13.38 ] プッ
482 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 03:05:05.71 ] コマンドプロンプトから引数を与えたときはちゃんとaiueo.txt作れるんだけど ドラッグアンドドロップでやるとaiueo.txtを作ってくれない どうしたらD&Dで引数受け取ったとき出力をファイルに書き出せる? aiueo.bat ------------------- setlocal set a=aiueo.txt if not exist %a% (echo Aiueo > %a%) date /t >> %a% time /t >> %a% echo %1 >> %a% endlocal
483 名前:482 mailto:sage [2012/02/01(水) 03:12:11.39 ] ごめんなさい自己解決しました バッチファイルのあるフォルダじゃないとこに保存されてた・・・
484 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 04:40:16.31 ] >%~dp0%a%
485 名前:482 mailto:sage [2012/02/03(金) 03:10:09.37 ] d
486 名前:忍法帖 [2012/02/05(日) 01:47:02.01 ] --------終了-------
487 名前:忍法帖 [2012/02/05(日) 01:47:36.54 ] --------終了-------
488 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 03:25:30.09 ] 質問をさせて下さい。 親フォルダにbatを置いて実行し、batの力でそこから子フォルダ、よく孫フォルダ、たまに曾孫 稀により下のバラバラな階層にある複数の最下層フォルダを、順々にカレントディレクトリ にしたいのですが、どうやればよいのでしょうか? やりたいことは最下層フォルダにあるファイル数が10個未満の場合に その最下層フォルダを任意の場所に移動したいのです。 最下層フォルダからの個別移動に関しては最後の削除あたりがうまくいきませんでしたが それ以外はこのスレを参考にして、なんとか動かすことができました。ありがとうございます。 後は親から複数の最下層フォルダに辿り着ければ何とかなりそうなのですが… どうか知恵をお貸しください。よろしくお願いします。 個別の処理.bat for /f %%a in ('dir /a-d ^|find "個のファイル"') do ( echo %%a if %%a LSS 10 ( call :IDOU ) else ( echo 10個以上ある ) ) exit /b :IDOU echo このフォルダ内のファイル数は10個未満 for %%I in ("%~dp1.") do ( md "%%~nxI" set DNAME="%%~nxI" move *.* "%~dp0%%~nxI" move "%~dp0%%~nxI" "C:\Users\XXX\Desktop\移動先\" cd .. pause del "%~dp0%%DNAME:~1,-1%" ) exit /b
489 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 05:35:08.76 ] >>488 カレント配下のディレクトリ全てで最下層であるかどうかの判定 for /d /r %%a in (*) do ( for /f "usebackq" %%b in (`dir /ad "%%a"^|find "個のディレクトリ"`) do ( if %%b==2 (echo "%%a" の下にディレクトリはないよ) ) ) pause exit /b > 最下層フォルダからの個別移動に関しては最後の削除あたりがうまくいきませんでしたが echo on にしてみれば何が悪いか分かるはず
490 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 05:35:19.42 ] >>488 :IDOUをcallするときに引数いれてないけど、:IDOUの中で%~dp1って使う意味はあるの? それとsetするときはset v="〜"じゃなくてset "v=〜"ってしたほうがいいと思うよ そうすれば変数の中にダブルクォーテーションが入らない delのところも普通に%DNAME%と書けるようになる ところでdelのところ%の数がおかしいんじゃないか? 削除がうまくいかない原因はそれではなかろうか 最下層の判定は、そのディレクトリ内のディレクトリの個数調べればいいんじゃね ディレクトリを順に回りたければ for /d /r %%a in (*) do (pushd "%%a" 〜) とか for /f "delims=" %%a in ('dir /ad /s /b') do (pushd "%%a" 〜) とか? こんな感じで実行したところからサブディレクトリを全部回ってくれるんじゃないかな
491 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 05:40:35.55 ] レスがかぶっちゃった delはファイルじゃなくてディレクトリ消したいのか だったらそもそもdelじゃなくてrmdirにしないと
492 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 06:14:41.60 ] >>488 set MVDIR="C:\Users\XXX\Desktop\移動先" for /d /r %%a in (*) do ( for /f "usebackq" %%b in (`dir /ad "%%a"^|find "個のディレクトリ"`) do ( if %%b==2 ( for /f "usebackq" %%c in (`dir /a-d "%%a"^|find "個のファイル"`) do ( if %%c lss 10 ( move "%%a" "MVDIR" ) )))) pause exit /b
493 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 11:23:22.56 ] 実行しなくてもわかる、1個目はリネーム、2個目以降は上書き確認でストップ
494 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 12:29:44.08 ] >>489 以前はusebackqも/rも難しく考えて良く分からなかったのですが このような身に沁みて実用的なアドバイス頂いたお陰で身近な存在になれました。 ググッて他の実用例を見ながら勉強します。ありがとうございます。とても参考になりました。 後はecho onについてなんですが、これは最初の行に@echo onと書くだけで良いのでしょうか? 現在はecho 変数 かアヤシイ直後にpauseでcmd画面の直前を確認する位しか方法が分かりません 初歩的な質問ですみませんが、もしよろしければご指導頂ければ助かります。 >>490 カレントフォルダ名を取得しようとしたforになりますが%~dp0.ですね、失礼しました。 それとsetについてですが、二重の"のうち1つを削る様な場面では有効でしたが 例えばset "v=v&v"とするとecho "%v%"では大丈夫でも%v%ではバグるみたいでした。 もし私のやり方が間違っていたらごめんなさい…けど便利ですね。 これからは使わせて頂きます。最下層判定と合わせてありがとうございました。
495 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 12:31:41.87 ] >>491 cdの行を消してrmdir "%~dp0"としてみましたが出来ませんでした。 「プロセスはファイルにアウセスできません。別のプロセスが使用中です。」 との事だったので、そもそもの消すフォルダからbatを実行したのでは難しそうと思い 試しにrmdir "C:\Users\owner\Desktop\移動先\新しいフォルダ" としてみたら無事に消す事が出来ました。ありがとうございます。 >>492 ありがとうございます!無事に出来ました! 粋な"MVDIR"のお陰でもう忘れないと思います。 後はじっくり解読しながら使いこなせるよう頑張ります。 わざわざ全文書いて頂きどうもありがとうございました。 >>493 >2個目以降は上書き確認でストップ 483では出てきませんでしたが、確かに他の書き方だと出てきました。 てっきり削除確認のY/Nかと思ってましたが上書きだったんですか… 思いもしませんでした。ご指摘どうもありがとうございました。
496 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 13:04:19.85 ] >>494 echo %v%でばぐるのかな これは&を^&に置換するか、 setlocal enabledelayedexpansion としておいて、echo !v!とかすればちゃんと&も表示されるよ
497 名前:デフォルトの名無しさん mailto:sage [2012/02/07(火) 17:07:11.18 ] 置換するにも、遅延しないとできねえよ
498 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 18:25:43.69 ] windowsのスタートアップの中でバッチファイルを動かして、他のマシンにマジックパケットを 送りたいんですが、どうもその時点で無線LANが繋がってないようで、対象マシンがWakeUp してくれません。 バッチ処理を遅延するにはどうしたらよいですか?
499 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 19:04:48.67 ] ping -n timeout
500 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 21:01:48.95 ] Vista 以降ならむしろ、スタートアップじゃなくてタスク向きな気がする。