[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/23 10:33 / Filesize : 215 KB / Number-of Response : 844
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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 以降ならむしろ、スタートアップじゃなくてタスク向きな気がする。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<215KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef