【.cmd】 バッチファイルスクリプト %11 【.bat】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
15/02/25 19:09:59.39 5hx8q1nT.net
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。
※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %10 【.bat】
スレリンク(tech板)
それ以前の過去スレ
%9  スレリンク(tech板)
%8  スレリンク(tech板)
%7  スレリンク(tech板)
%6  スレリンク(tech板)
%5  スレリンク(tech板)
%4  スレリンク(tech板)
%3  スレリンク(tech板)
%2  スレリンク(tech板)
%1  スレリンク(tech板)

2:デフォルトの名無しさん
15/02/25 19:46:08.29 v67AOmy/.net
< `∀´>ニダー

3:1
15/02/25 20:30:42.86 5hx8q1nT.net
今回はスレタイに[転載禁止]と表示させないため、"sageteoff"を>1のメール欄に入れてます。
("ageteoff"でもOKらしいが)
次回以降のスレ建て時も同じ配慮が必要になると思うので注意しましょう。
詳細は以下の記事を参照
URLリンク(info.2ch.net)
また、今回は前スレが>>997に達しても次スレの話題を誰も発言しなかったため、もう少しで誘導が間に合わなくなるところでした。
こんな事がないよう、次スレは>>980の人が建てる方向で願います。
(建てる途中で連投規制に巻き込まれて次スレに誘導できなくなる可能性も考慮すべきかも)
更に余談ですが URLリンク(www.forest.impress.co.jp) でも報じられている通り、
来月3日の火曜日から2chブラウザ開発が許諾制となります。
( URLリンク(i.imgur.com) は昨日の午前0時現在における2chブラウザのAPI対応状況一覧らしい)
2chブラウザを使っている人は、これに備えてボード一覧取得URLを以下のURLに変更しておくほうがいいかも。
URLリンク(kita.jikkyo.org)

4:デフォルトの名無しさん
15/02/26 21:20:03.84 rvCGpWQW.net
最近作ったバッチ cdif.bat
環境チェック用に
rem cdif.bat
@echo off
if '%1'=='' exit /B 255
pushd D:\temp ← .defファイルを保存する場所
setlocal
set z=%*
set y=%z: =%
set x=%y:/=%
%* > %x%.txt
if not exist %x%.def goto _new
set errorlevel=
diff %x%.def %x%.txt
if %errorlevel% == 0 goto _end
:_new
copy /Y %x%.txt %x%.def >nul
:_end
endlocal
popd
パラメ−タにコマンドを置くと前回実行結果との違いを表示する

cdif whoami /all
cdif net start
cdif assoc

5:デフォルトの名無しさん
15/02/28 13:23:16.31 Vf0Nycmv.net
転載禁止で何か不都合があるんですかね

6:デフォルトの名無しさん
15/02/28 16:21:11.47 YYADq1Ex.net
>>5
見た目がうざい
転載禁止は嫌儲が運動した結果の出来事
2015年3月3日以後に Spyle 以外の専ブラが使えなくなるのも嫌儲が運動した結果。
嫌儲に手を貸す必要はない。
そもそも転載禁止と表示しても、法的措置どころか苦情すら入れてないのが現実。
何の効力もない。

7:6
15/02/28 16:26:28.85 YYADq1Ex.net
ちなみに僕は >1 ではないけど、自分が立てるときは非表示にしてるよ。

8:デフォルトの名無しさん
15/02/28 16:56:20.46 M5P8h0pv.net
>>4
存在チェック手を抜くと完走しないどころか、場合によっては泣き見るよ
pushd D:\temp || mkdir D:\temp &amp;&amp; pushd D:\temp
WHERE app1.exe
if not %ERRORLEVEL%==0 goto :eof
などね。まあWHEREがないOSには向かないけど
あるいはこんなのか for %%I in (app1.exe app2.exe) do if /I "%%~$PATH:I"=="" goto :eof

9:デフォルトの名無しさん
15/02/28 17:01:28.28 M5P8h0pv.net
なんか文字化けしてるんで訂正。一行目はアンド記号2つね
pushd D:\temp || mkdir D:\temp && pushd D:\temp

10:デフォルトの名無しさん
15/02/28 17:13:03.89 /zEhZlSp.net
>>9
2chではしたらばやまったりと違い、普通に&って書けばいいよ
if not exist app1.exe goto :eof

11:9
15/02/28 17:35:28.42 M5P8h0pv.net
>>10
教えてくれてありがとう、確かに化けないね
書き込む環境によるのかな?Vimエディタのchaliceプラグインから書いた
次からは気をつけるよ
>>4
もうひとつ訂正。app1.exeはdiff.exeに読み替えてほしい
win8, 8.1は知らないけど7proには無かったので

12:デフォルトの名無しさん
15/03/01 01:13:03.66 3pqosVHZ.net
>>11
ありがとうございます。
windows標準に diff.exe が無いのをうっかりしていました。
入手するか、似た機能のスリーソフトが必要でした。
diff.exe はgnu フリーソフトです。

13:デフォルトの名無しさん
15/03/01 09:21:11.77 lUru30LD.net
何でもかんでも小文字で書いてるようでは、な…w

14:デフォルトの名無しさん
15/03/01 10:40:56.37 auZLsY4i.net
小文字と半角が区別できない人がいると聞いて

15:デフォルトの名無しさん
15/03/01 18:14:23.46 iMUnkbvv.net
>>12
表示とエラーレベル確認だけならFCコマンドがあるよ

16:デフォルトの名無しさん
15/03/02 17:20:43.72 uyLNdg9p.net
>>14
中学出たらまた来いやド素人

17:デフォルトの名無しさん
15/03/07 12:52:17.55 z12PK9QI.net
突然で悪いですが
「shutdown -m」って一度に複数のPCを選択することは出来るのでしょうか。
shutdown -m \\○○ \\△△ ってするのですか?
分かるかたはお願いします。

18:デフォルトの名無しさん
15/03/07 14:47:08.28 CawHWVdd.net
for %%a in (
\\○○
\\△△
) do (
shutdown -m %%a
)

19:デフォルトの名無しさん
15/03/14 01:24:35.99 3WQ81uoz.net
バッチ中で
echo 0 g%%%%h 1 i%%%j 2 l%%m 3
echo 0 n%%%%p 1 q%%%r 2 s%%t 3 u%v 4
とすると
0 g%%h 1 i%m 3
0 n%%p 1 q%v 4
と表示されます、なぜでしょうか?

20:デフォルトの名無しさん
15/03/14 02:15:45.11 nzf6iyBd.net
%%→%
%j 2 l% →環境変数と見なされて消えてる?
%m→m
多分こんな感じ

21:デフォルトの名無しさん
15/03/14 02:28:40.98 3WQ81uoz.net
>>20
ありがとうございます。
パズルのつもりで考え、同じ結論になりました。
echo 0 n%%%%p 1 q%%%r 2 s%%t 3 u%v 4
の場合
%r 2 s% が消え、%t 3 u% が消えるようです。

22:デフォルトの名無しさん
15/03/16 10:51:59.75 n6rD9DBv.net
@cd /d "%~f1" && cmd /k prompt $g $t (%username%@%computername%) "$p"$_$g
EXIT

23:デフォルトの名無しさん
15/03/21 11:58:32.58 2zhIHOyA.net
jpgをbpgに一括変換したくて
echo off
for %%FILE in (*.jpg) do (
bpgenc.exe %%FILE%~nI.jpg -o %%FILE%~nI.bpg
pause
こんな感じで作ってみたんですが
何分初心者なもんでエラーで動きませんでした
jpgがあるフォルダでbatを実行すると
そこのフォルダに同じ名前のbpgが出来るように出来ませんか?

24:デフォルトの名無しさん
15/03/21 12:29:07.78 JFP+1Mfc.net
>>23
forの%変数は、一般の環境変数とは別物で%a〜%z,%A〜%Zの52個しか使えない
書くなら、以下のようになるけどbpgencの仕様を知らないので動作するかどうかは不明
(カレントにbpgencや*.jpgがあるとして)
for %%I in (*.jpg) do (
bpgenc.exe %%I -o %%~nI.bgp
)

25:デフォルトの名無しさん
15/03/21 12:34:03.49 JFP+1Mfc.net
>>23
間違い訂正と一応ファイル名の半角空白対策で""


26:ナ括った方がいいね for %%I in (*.jpg) do ( bpgenc.exe "%%I" -o "%%~nI.bpg" )



27:デフォルトの名無しさん
15/03/21 13:43:28.87 2zhIHOyA.net
ありがとうございました

28:デフォルトの名無しさん
15/03/22 20:30:08.30 MzKPDq1O.net
ディレクトリを指定する時に
"C:\Windows"と書くか"C:\Windows\"のように最後に\を付けるのはどっちが正しいんでしょうか?
全てのファイルを指定したい時も*.*と書くのか*だけでもいいんでしょうか?

29:デフォルトの名無しさん
15/03/22 22:15:52.50 MRoLQSW+.net
ディレクトリエントリと認識させるなら前者
ディレクトリパスと認識させるなら後者
どちらか正しいかは関係ない(個人の手法により変わる)

30:デフォルトの名無しさん
15/03/23 00:27:47.55 LkjS11eT.net
個人の手法と言うよりアプリによるかと。
下手なことせずMS謹製APIを(正しく)使ってるアプリは大体柔軟に解釈してくれる。
一方で、独自実装かつ手抜きだとそのアプリのルールに従わないと駄目。

31:デフォルトの名無しさん
15/03/23 03:17:53.73 8SvXlaBo.net
Windowsでは"*.*"と"*"は同じ結果になるようだが
DOSだと"*"は"*."の意味で解釈されたような気がするが・・・
よく覚えてないが違ったかな

32:デフォルトの名無しさん
15/03/23 07:56:45.22 vmjZ2UK4t
scって書き込み反映遅いのね

33:デフォルトの名無しさん
15/03/23 07:50:10.00 Zh4Tlzc4.net
>>27
xcopyコマンドは末尾に\を付けると対話モードにならなくて済むから
\を付けるのがベター

34:デフォルトの名無しさん
15/03/24 21:50:49.26 15EAIg4V.net
>>27
オブジェクトとして扱うか 場所として扱うか

35:デフォルトの名無しさん
15/03/26 11:42:29.93 TtvSKEog.net
バッチファイルでテキストファイルの中にある(" ")を(改行)に置き換えたいのですがどうしたらよいでしょうか
自力でここまで頑張ってみましたがわかりません
for /f "tokens= delims=""" %%i in (.filelist) do (
if "%%i" EQU "\n" (
(echo %%i\n)>> .filelist.tmp
)
move .filelist.tmp .filelist

36:デフォルトの名無しさん
15/03/26 14:29:43.73 eQva/kB3.net
>>34
● 空白が連続して並んでいる場合、空白1個とみなす、また改行だけの行は削除
(ファイル名がどんな場合でも必要ならbatは諦めてWSHでも使ってくれ)
@echo off
type nul>filelist.tmp
for /f "tokens=*" %%i in (filelist) do call :sub %%i
del filelist
move /y filelist.tmp filelist
goto :eof
:sub
if "%1" equ "" goto :eof
echo.%1>>filelist.tmp
shift
goto :sub
● 別の方法:空白1つずつを改行に変換(トリッキーだけど)
@echo off
setlocal EnableDelayedExpansion
set LF=^

type nul>filelist.tmp
for /f "tokens=*" %%i in (filelist) do (
set d0=%%i
call :sub
echo !d1!>>filelist.tmp
)
del filelist
move /y filelist.tmp filelist
goto :eof
:sub
set d1=%d0: =!LF!%
goto :eof

37:デフォルトの名無しさん
15/03/26 14:57:07.15 TtvSKEog.net
>>35
中身が
"ho ge" "fuga" "bar"みたいな感じなんで1行だけなのでそれだとダメなんですよね
batは諦めたほうがいいですか?

38:デフォルトの名無しさん
15/03/26 15:10:34.99 TtvSKEog.net
別の書き方でやりたいことできてしまったので答えてもらわなくていいです
ありがとうございました

39:デフォルトの名無しさん
15/03/29 23:08:04.40 brTyAs26.net
if 文で大小を調べる場合、
数字以外の文字があっていても無視してくれるらしい

@echo off
rem 指定ファイル1,2のどちらが新しいか調べる
if '%2'=='' exit /B 200
if not exist


40:%1 exit /B 201 if not exist %2 exit /B 202 setlocal set x=%~t1 ←年月日 時分を得る set y=%x: =% ←空白を除く set f=%y:~2% ←32bit以内の数にする echo %f% %1 ←確認用 set x=%~t2 set y=%x: =% set g=%y:~2% echo %g% %2 if %f% GTR %g% goto g echo new %2 endlocal exit /B 255 :g echo new %1 endlocal exit /B 0



41:デフォルトの名無しさん
15/03/30 18:13:52.92 7Wq+AZOx.net
趣旨はわかるけどすべて置換しても手間は変わらないような
方法は人それぞれだけど
set x=%~t1
for %%I in (/ " " ^:) do call set x=%%x:%%~I=%%
set g=%x:~2%
echo %g% %1

42:デフォルトの名無しさん
15/04/01 01:00:08.58 AO10ro0D.net
>>39
そんな方法があるのかと思いましたが
call
in (/ " " ^:)
がよくわかりません
??

43:デフォルトの名無しさん
15/04/07 18:10:05.82 jQXYCPe4.net
URLリンク(d.hatena.ne.jp)
上記サイトを参考にバッチファイルを作ったのですが、
%rtmp% --rtmp "rtmpe://fms2.uniqueradio.jp/" --playpath "aandg2" --app "?rtmp://fms-base1.mitene.ad.jp/agqr/" --stop %dur% --live -o %out%
この部分は何を指しているのでしょうか?
コマンドプロンプトでテストをすると
「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています」
との表示が出るのですがどうしたらよいのか解りません
初心者なので噛み砕いて説明していただけるとありがたいです
よろしくお願いします

44:デフォルトの名無しさん
15/04/07 18:23:55.58 tPergwIj.net
ネットラジオ受信してるのかな

45:デフォルトの名無しさん
15/04/07 21:40:29.78 ms0ReaQq.net
最初の%rtmp%が受信用のプログラムrtmpdumpのパスを指定してるんだろうけど、それ以降の部分はそのプログラムのオプションだからそっちのヘルプなりを見るしかないな

46:デフォルトの名無しさん
15/04/08 21:33:07.81 C3eEupG0.net
>>42>>43
ありがとうございます
rtmpdumpのヘルプがどこにあるのかすらわからない状況ですが、これから頑張ります

47:デフォルトの名無しさん
15/04/09 07:03:12.72 teaLGODa.net
>44
ググったら URLリンク(rtmpdump.mplayerhq.hu) でWindows版のzipファイルをダウンロードできたが、
その中に入ってる rtmpdump.1.html を適当な翻訳サイトで和訳するしかなさそうだな
つーか質問する前に、それを一通り読んだ?
日本語の解説サイトも幾つか見つかったから、それも一通り読んでおけば質問の手間が一気に省けたのでは?
あと、同梱の README.txt によると URLリンク(slproweb.com) から
Win32 OpenSSL v1.0.2a Light も予め入手〜インストールしておくほうが良さそうだな
こちらは問題のバッチと直接関係なさそうだが…

48:デフォルトの名無しさん
15/04/09 20:47:41.89 ds7brpvM.net
0からの距離、絶対値を求めるにはどうしたらいいのでしょうか?

49:デフォルトの名無しさん
15/04/09 21:48:31.05 56Kz/Tqn.net
>>45
ありがとうございます
rtmpdumpの2.4をダウンロードしたときには入っていなかったようなので確認できていなかったみたいです
ですがやり直してみてうまくいったので無事バッチファイルは作成できました
みなさんありがとうございました

50:デフォルトの名無しさん
15/04/10 07:48:39.03 1r0Sjsp4.net
>>46
バッチファイルはそういう用途には使えない(使わない)

51:デフォルトの名無しさん
15/04/10 08:53:04.22 xkkjlCYH.net
>>48
絶対値をわざわざ「0からの距離」と書いてる時点で、靴下臭さが漂う釣り

52:デフォルトの名無しさん
15/04/10 11:49:51.87 KlyCEozYg
if 文だとつまらんので

rem v=-2147483647〜2147483647
set /a "a=v-(v>>30&2)*v"
echo %a%

53:デフォルトの名無しさん
15/04/10 18:17:04.09 OSkAW5mv.net
一応計算はできるが、元の数値はどうやって与えるのか、結果をどのように通知するのかを規定してもらわないとなんとも

54:デフォルトの名無しさん
15/04/11 01:45:05.27 TrV790b8.net
ネットにつながっているかどうか調べるバッチを作ってみた
@echo off
set errorlevel=
arp -a|findstr "物理アドレス" >nul
if %ERRORLEVEL% == 0 goto ok
echo 未接続、
exit /B 255
:ok
echo 接続中
exit /B 0
pingを使うのを使っていたがうまくいかない時があるので、
arpに変更したらうまくいった

55:デフォルトの名無しさん
15/04/11 06:44:22.81 fyKqFsgJ.net
糞バッチはいらないです

56:デフォルトの名無しさん
15/04/11 08:01:29.73 /PBMBHvW.net
どこで聞けばいいのかわからないので、すみませんがここに失礼します
相応しいスレがあって、教えて頂ければそちらに移動します
DOS起動のUSBメモリを作成してブート
目的のexeファイルを実行し終えて再起動した場合に、コマンドでどのようにすればいいのでしょうか?
shutdown -rと打ち込むと「Bad command or filename - "shutdown".」と表示されてしまいます
電源ボタン長押しの強制終了は、HDDのSMART情報に電源断による磁気ヘッド退避回数が1カウントされてしまい
なんか嫌なのです・・・

57:デフォルトの名無しさん
15/04/11 14:23:00.94 5Lnp57nw.net
>>54
DOSで電源断するプログラムをUSBにコピーしておきそれを指定するとか?
フリープログラムでそういうのはあったと思うので捜して使えるものを選択する
ちょっと検索してみたらFreeDOSにはfdapmとかがあるようだ
昔のMS-DOSにもver.6の頃にはpoffコマンドがあったような気もするけど
メーカー独自コマンドだったかも
また、SMARTの値は気にすることもないだろ
それこそMS-DOS時代ならスイッチでの電源断しかなかったわけだし
これでHDDがどうにかなってたらそれこそ大問題だった(まあSMARTの仕組み自体無かったけど)

58:デフォルトの名無しさん
15/04/11 15:00:26.00 2fqMRu3m.net
shutdownというコマンドは実体がexeファイルである、という解説を加えた方が良いかと。
ちなみにwin9xの緊急用ディスク(だったっけ?)には入ってた気がする。

59:デフォルトの名無しさん
15/04/11 16:01:15.67 Wkw29TQd.net
Ctl+Alt+Del ってここでは使えないんだっけ?

60:デフォルトの名無しさん
15/04/11 16:08:40.34 ZafMUMT0.net
Ctrl+C?

61:デフォルトの名無しさん
15/04/13 02:52:48.66 d+oF06mH.net
for文で複数のPCへファイルチェックしてると
dos窓にはプロセスが使用中とエラーログがながれてますが
実行結果テキストはそのPC内容が空白になります
このプロセスエラーを表示させるにはどうしたら
いいのでしょうか?

62:デフォルトの名無しさん
15/04/13 06:51:07.81 lOTy3Gtt.net
1>stdout
2>stderr

63:デフォルトの名無しさん
15/04/13 11:41:44.48 PhEs3M2y.net
>>59
URLリンク(support.microsoft.com)
いろいろあるから調べてね
ちなみにforのinで使う場合はエスケープ記号も忘れずに

64:デフォルトの名無しさん
15/04/14 10:36:28.


65:94 ID:N5fdZKD9.net



66:デフォルトの名無しさん
15/04/14 12:14:07.00 +cu4u0lD.net
forfiles /P C:\Users\Owner\Desktop\test /S /D -1000 /C ^
"cmd /c echo C:\Users\Owner\Desktop\test\@file|findstr "^backup"&&del /Q C:\Users\Owner\Desktop\test\@file""

67:デフォルトの名無しさん
15/04/14 13:06:46.44 N5fdZKD9.net
>63
早速ありがとうござました。

68:デフォルトの名無しさん
15/04/14 13:48:29.77 ZcIa+N/O.net
forfilesに/m backup*つければいいんじゃないの?

69:デフォルトの名無しさん
15/04/14 23:10:10.99 iRGvGEKT.net
call [〜.bat]
if not %ERRORLEVEL%==0
(
A1
)
:A1
call [〜.bat]
if %ERRORLEVEL%==0
(
echo "test"
)
上記の処理で最初にcallするバッチからは返り値(exit /b 0)が返ってくるのですが、
A1のサブルーチンに移行して、再度別のバッチをcallした時の返り値(exit /b 0)が返ってこず、
callしたバッチ内のexit /b 0の手前で処理が止まっており、echo "test"の処理まで行きません。
callしたバッチ内では最初にsetlocalの宣言を行い、endlocalの記述は省いています。
どなたか原因がわかる方が居たらお願いします。

70:デフォルトの名無しさん
15/04/15 05:47:48.98 qbvA5Mq5.net
@ECHO OFF
:STARTPROC
ECHO ●● このバッチファイルはWindows7で動作確認済です ●●
ECHO ・「proxy2ch」は i:\bin\proxy2ch フォルダにインストール済
ECHO ・「JaneXeno」は i:\bin\JaneXeno フォルダにインストール済
ECHO 以上の環境を前提としています
SETLOCAL
TITLE %~0
i:
ECHO ●● フリーソフト「proxy2ch」が起動してるかどうかを確認します ●●
ECHO ・まだ起動してない場合、先に「proxy2ch」を起動してから「JaneXeno」を起動します
ECHO ・既に起動している場合、即「JaneXeno」を起動します
TASKLIST /v | FINDSTR /i /r "proxy2ch.*running" > NUL
IF NOT ERRORLEVEL 1 GOTO STEP_OK
:STEP_NG
ECHO ●● まだ「proxy2ch」が起動してない為、ウィンドウ最小化状態で起動します ●●
ECHO (起動後、数秒待ってから「JaneXeno」を起動する事になります)
CD i:\bin\proxy2ch\Win32
START /MIN i:\bin\proxy2ch\Win32\proxy2ch.exe
PING 0 > NUL
:STEP_OK
ECHO ●● フリーの旧2ch仕様BBS用ブラウザ「JaneXeno」を起動します ●●
CD i:\bin\JaneXeno
START i:\bin\JaneXeno\Jane2ch.exe
:ENDPROC
ENDLOCAL

71:デフォルトの名無しさん
15/04/15 14:31:47.66 I1xT3eb5.net
>>66
・条件分岐後に変な改行入れないでください
・A1なんてコマンド誰も知りません
・そもそもサブルーチンに移行できていません
 ただ次行以降を実行しているだけです
提示したバッチ全体の構文がおかしいです
根本から見直してください

72:デフォルトの名無しさん
15/04/15 18:56:17.05 3mk21zLe.net
原因もクソもわかんねぇんだったら、1行ごとにpauseコマンド入れてデバッグすりゃいいんじゃねw

73:デフォルトの名無しさん
15/04/15 19:14:08.41 iV7zdKJV.net
>callしたバッチ内のexit /b 0の手前で処理が止まっており
これが本当だったらそのbat内の処理が悪いんだろ

74:デフォルトの名無しさん
15/04/16 13:55:23.26 PKlW+mXs.net
またまたお世話になります。
forfiles /P E:\HDD\backup /M *camdata* /S /D -10 /C "cmd /c rd /S /Q E:\HDD\backup\@file"
USB外付けHDDに監視カメラのデータを保存しています。
保存期間10日を過ぎたものはタスクスケジューラで削除していこうと思い、
上記バッチを実行すると該当データは削除できるのですが、その後に
ディレクトリ名が無効です。
ディレクトリ名が無効です。
ディレクトリ名が無効です。



とエラーがループして出てしまいます。
>>62-65
のデスクトップでのテストでは、エラーになりませんでした。
ご指導ねがいます。

75:デフォルトの名無しさん
15/04/16 19:05:59.05 dl3K38JP.net
forfiles /P E:\HDD\backup /M *camdata* /S /D -10 /C ^
"cmd /c if @isdir==TRUE (rd /S /Q @path) else (del @path@file)"

76:デフォルトの名無しさん
15/04/17 00:25:16.38 w/dpiMO4.net
バッチファイルはプログラミングしづらいだろ?
WSH(VBScript, JScript)か、PowerShell でも使ったら?

Windows PowerShell
コマンド & スクリプティングガイド
五十嵐貴之(いからしたかゆき)、2015/3/25

77:デフォルトの名無しさん
15/04/17 07:57:13.26 x1OzcVcc.net
自分はParl使ってるわ

78:デフォルトの名無しさん
15/04/18 13:07:53.50 PKb7WJB3.net
下らない質問で悪いけど
コマンドプロンプトってターミナルエミュレーターかシェル
どっちの事を指して使われてる言葉なの?

79:デフォルトの名無しさん
15/04/18 13:10:24.18 sjW3inIo.net
>>75
コマンドプロンプト

80:デフォルトの名無しさん
15/04/18 20:15:04.28 3vDqFDHY.net
ターミナルエミュレータに相当する物は別に存在する。
ProsessExprorer系のツールでプロセス観察してみるとよく分かるよ。

81:デフォルトの名無しさん
15/04/19 02:00:49.40 0O9OZvk2.net
>>72
forfilesなんて、昔はなかった
いつからなんだろう
古いサイトだと解説していない

82:デフォルトの名無しさん
15/04/19 14:25:40.05 YOn0sVc9.net
Windows上でtarファイルの展開を行うバッチファイルを作成したいのですが、
フリーソフトのTAR.exeを使用して、
[フルパス]TAR.exe xvf [tarファイル名(フルパス)] -C [展開先ディレクトリ]で実行しても、
エラーで展開先にうまく解凍出来ません。
展開先の指定方法についてどなたかご教授願います。

83:デフォルトの名無しさん
15/04/19 14:51:37.34 9oYjIFcR.net
エラー貼りましょう

84:デフォルトの名無しさん
15/04/19 14:58:02.24 ZbwKHW2Q.net
とりあえず-xvfじゃないのか?

85:デフォルトの名無しさん
15/04/19 16:15:39.93 5HhODAvd.net
>>81
xvf の x はオプションじゃなくてコマンドだから "-" はいらない
>>79
そのフリーソフト -C オプションサポートしてるんか?

86:デフォルトの名無しさん
15/04/19 17:36:35.63 uCqT+TY7.net
-Cって展開先を指定するオプションじゃなくて作業前にカレントディレクトリを変更するオプションだから
存在しないディレクトリ指定してエラーになってるとかそういうオチでは

87:デフォルトの名無しさん
15/04/19 23:32:53.44 6LHr2UmH.net
>>79
本筋とはちと関係ないけど、tarって未圧縮の単なる書庫ファイルだからtgz(tar.gz)に
したらどないでっしゃろ

88:デフォルトの名無しさん
15/04/21 22:22:35.03 k+lIUh1M.net
☆ 日本の核武装は絶対に必須ですわ。☆
URLリンク(www.soumu.go.jp)
☆ 日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、改憲の参議院議員が
3分の2以上を超えると日本国憲法の改正です。皆様方、必ず投票に自ら足を運んでください。
私たちの日本国憲法を絶対に改正しましょう。☆

89:デフォルトの名無しさん
15/04/28 09:18:46.56 AL7JlJvX.net
Windows7でディレクトリへのシンボリックリンクってどうやって消すんですか?
> mklink /d c c:\
c <<===>> c:\ のシンボリック リンクが作成されました
> del c
D:\c\*、よろしいですか (Y/N)? y
のように質問された上にy押した後も消えてません

90:デフォルトの名無しさん
15/04/28 09:39:19.66 l73V3plJ.net
普通にエクスプ


91:ローラから消せばいいのよ



92:デフォルトの名無しさん
15/04/28 09:43:27.68 8AGhJBnr.net
シンボリックリンクだろうがジャンクションだろうがディレクトリ消すならならrdだろ

93:デフォルトの名無しさん
15/04/28 17:42:15.31 Az6wvvs4.net
del はファイル削除、 * でなくて *.* でも?
フォルダごと消すなら >>88

94:デフォルトの名無しさん
15/04/30 12:53:11.12 ViywK5A0.net
rdでいけました
ありがとうございます

95:デフォルトの名無しさん
15/05/04 18:32:55.18 hzJehWEx.net
最近、バッチ童貞を卒業しました。
ディレクトリにある全てのファイルをhoge.exeにドラック&ドロップするパッチを作ろうとしています。
>>25を参考に作っていましたが、hoge.exeが複数立ち上がってとんでもない状態になってしまいました。
hoge.exe foo1 foo2 ...
が実行できるパッチはどのように書けば良いでしょうか?
よろしくお願いいたします。

96:デフォルトの名無しさん
15/05/04 19:01:55.28 tr24rDGI.net
start "" /wait "hoge.exe" foo1 foo2
でどや?

97:デフォルトの名無しさん
15/05/04 19:11:29.61 vdCrn8hY.net
hoge.exe %*

98:デフォルトの名無しさん
15/05/04 20:18:58.14 hzJehWEx.net
cd /d "E:¥aaa"
for %%I in (*.bbb) do (
"hoge.exe" "%%*"
)
cd /d "E:¥aaa"
"hoge.exe" "%*
cd /d "E:¥aaa"
for %%I in (*.bbb) do (
start "" /wait "hoge.exe" "%%I"
)
cd /d "E:¥aaa"
start "" /wait "hoge.exe" "%*"
をやってみましたが、ダメでした。
どうやればいいんだろう 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


99:デフォルトの名無しさん
15/05/05 00:56:28.99 cn76hmxd.net
setlocal EnableDelayedExpansion
set FILES=
cd /d "E:\aaa"
for %%x in (*.*) do set FILES=!FILES! "%%~x"
hoge %FILES%

100:デフォルトの名無しさん
15/05/05 03:50:23.26 jBh84Fwc.net
引数で渡せる文字列って制限なかったっけ?
任意フォルダの全ファイルを一度に羅列して渡すのはできるだけ回避したほうが良くないかな

101:デフォルトの名無しさん
15/05/05 12:12:24.08 h/qL4+vG.net
>>95
ありがとうございます
すごい
ずっと悩んでいたから感激です
ほんと助かりました
>>96
拡張子でしていしておきました
アドバイスありがとうございます

102:89
15/05/06 18:36:51.79 kduajoAs.net
93の方法で上手くいったのですが、欲が出てきてしまいました。
サブフォルダにあるファイルについてもできないか試していましたが、うまくいきませんでした。
試したのは
setlocal EnableDelayedExpansion
set FILES=
for /R "E:¥aaa" %%x in (*.bbb) do set FILES=!FILES! "%%~fx"
hoge %FILES%
です。%%~xを%%~fxや%%~$PATH:xに変えてみましたが、だめでした。
何かいい方法は無いでしょうか?

103:89
15/05/06 19:36:01.98 kduajoAs.net
hoge.exeが使ってはいけない文字を使っていたようでした
ファイル名、ファルダ名を変えたらうまくいきました

104:sage
15/05/07 02:20:57.96 kCRc77b6.net
なんちゃってインストーラーを作成したく下のように書いたのですが、管理者として実行するとcmdが一瞬開いた後閉じてしまいます。
調べてみたのですがどうしたらいいか分りませんでした。どうやったら上手くいくのかどなたかご教示して頂けないでしょうか?
その1.dllとその2.dllは作成したバッチと同じディレクトリにあります。

@echo off
cd %~dp0
copy /-y その1.dll C:\Windows\SysWOW64\
copy /-y その2.dll C:\Windows\SysWOW64\
cd \Windows\SysWOW64
regsvr32 その1.dll
regsvr32 その2.dll
exit

105:デフォルトの名無しさん
15/05/07 02:30:30.14 VKPrOxig.net
@echo off

@echo on
exit

pause
にしてチェックしてみるとか

106:デフォルトの名無しさん
15/05/07 08:06:10.91 VSUD10fG.net
pause入れて一行ごとに確かめるしかないでしょうなあ

107:デフォルトの名無しさん
15/05/07 11:09:54.36 KWH/KWxF.net
C:ドライブ以外に置いてあると引っかかりそうなのは
cd %~dp0

cd /d %~dp0
cd \Windows\SysWOW64

cd /d C:\Windows\SysWOW64

108:デフォルトの名無しさん
15/05/07 16:36:18.43 96jPVZUT.net
エラーとは関係ないけどバッチからregsvr32実行するなら/sオプション


109:付けないと 「成功しました」ってメッセージボックス出てそれ閉じるまでバッチの動作止まっちゃうね



110:sage
15/05/07 22:31:45.98 kCRc77b6.net
>>101,>>102 試してみたのですが変わらず一瞬で閉じてしまいました。
>>103 C:ドライブ上ですら上手くいかないので最初は付けていたのですが外しました。
>>104 /s は付けないほうが成功しましたと出るので、成功できてることが確認できていいかなと思いまして付けてませんでした。
自己解決しました。ファイル名だと動かなくなくことは知っていたのですが、どうやらフォルダ名も半角の括弧があると、バッチを右クリックで管理者として実行してもバッチとして認識されないようでした。
基本的なところが間違っていたようです。
色々とお騒がせしてすいませんでした。

ダブルクリックだと半角括弧あっても動くのに・・・

111:デフォルトの名無しさん
15/05/07 22:59:18.82 VSUD10fG.net
じゃあそれcmd.exe壊れてるんじゃね
一行ごとにpause入れて止まらんとか聞いたことないぞ

112:sage
15/05/07 23:15:37.73 kCRc77b6.net
そうなのでしょうか?
PCが2台あるのでregsvr32で試したのですが両方が同じ結果でした。
フォルダ名に半角括弧の( を付けて、管理者権限が必要なコマンドが入ったものを試していただけないでしょうか?
)だけだとなぜかうまくいきました。

113:デフォルトの名無しさん
15/05/07 23:24:22.25 yEqXNtFT.net
"("を含むパス上にあるbatファイルを、「管理者として実行」で正常実行できない
URLリンク(social.msdn.microsoft.com)

114:sage
15/05/07 23:44:02.20 kCRc77b6.net
>>108 ありがとうございます。OS入れ直しかと思ってた。

115:デフォルトの名無しさん
15/05/08 00:08:07.40 0odcB8A0.net
一般的にシステムを作るときには、
パス・ファイル名には、半角英数字と、
_ アンダーバーだけを使う
日本語、空白、/ \ などは、
外人が作ったアプリや他のOSで、バグを起こす
外人は日本語のことまで考えて、
アプリを作っていないため

116:sage
15/05/08 00:43:49.96 1YMiCyWS.net
>>110肝に銘じます

117:デフォルトの名無しさん
15/05/08 01:22:21.82 DmYJm/wo.net
>>110
> 日本語、空白、/ \ などは、
> 外人が作ったアプリや他のOSで、バグを起こす
逆になるべく日本語フォルダ、ファイル名にしておけば
海外製ウィルスが動作しなくなるかな

118:デフォルトの名無しさん
15/05/08 09:58:38.71 5fQ7r8Aw.net
>>112
イカタコとかは無理じゃね

119:デフォルトの名無しさん
15/05/08 16:37:33.99 U2au088Y.net
そもそもウイルスが壊してくるのはWindows内だったりするからいみないんだよなあ
全部日本語の窓互換OS開発すればありかもしれない

120:デフォルトの名無しさん
15/05/08 22:38:18.81 KwMVu8yd.net
>>110
Program Files(x86)とかいう名前をつけたのは外人だろ?

121:デフォルトの名無しさん
15/05/12 23:56:25.43 McgsoQJk.net
ドライブの空き容量を簡単に調べる方法はありますか。
dirを使えば最後に出ますが。

122:デフォルトの名無しさん
15/05/13 00:19:46.38 IRvX1zB3.net
fsutil volume diskfree c:

123:デフォルトの名無しさん
15/05/13 00:44:59.35 ++gYyXti.net
>>>117
ありがとうございます。
FSUTIL ユーティリティには管理者特権が必要です。
でしたが。

124:デフォルトの名無しさん
15/05/13 01:05:56.71 7VTqgTSP.net
wmic logicaldisk c: get freespace

125:デフォルトの名無しさん
15/05/15 21:00:38.39 FSXq3hA5.net
行の最後が\記号の場合、その\記号を削除する方法を
探しています。
E:\の場合はE:にしたいのです。
理由は、aria2c -dオプションでドライブ指定[E:\]の場合正常に動作せず、
[E:]で動作する。ためです。
よろしくお願いします。

126:デフォルトの名無しさん
15/05/15 21:37:19.52 G1rKhc+A.net
>>120
Googleでバッチファイル、テキストファイル、置換のキーワードでヒットするサイトを参考にしたら?

127:デフォルトの名無しさん
15/05/15 21:58:52.22 XJBM+btE.net
「行の最後」って何なのか分からないけど、仮に環境変数に入れた文字列だとすると
set x=E:\
if "%x:~-1%" equ "\" set x=%x:~0,-1%

128:デフォルトの名無しさん
15/05/15 22:00:53.20 j/48pAYL.net
call /?

129:デフォルトの名無しさん
15/05/15 22:30:21.33 FSXq3hA5.net
>>121
>>122
>>123
ありがとうございました。

130:デフォルトの名無しさん
15/05/16 00:42:02.22 O4uFm57f.net
>>119
ありがとうございます。表示できました。
wmic というコマンドは知りませんでした。
wmic /? でみると巨大なコマンドなのに。

131:デフォルトの名無しさん
15/05/18 19:51:05.44 a89GM3eE.net
for文の/Fオプションである
"delims="と"tokens=*"の違いがわかりません
どちらも区切りなしで全てが対象の気がするんです
どのように使い分けてるんでしょうか?

132:デフォルトの名無しさん
15/05/18 20:11:44.07 a89GM3eE.net
例えば文字列の長さ取得するvbsをbat内で取得する時、こんな感じだと思いますが
for /f "usebackq tokens=*" %%i in (`cscript //nologo "len.vbs" "hoge"`) do set les=%%~i
結果を受取る最後の部分、les=%%~iとles=%%iの違いが解りません
~の有無で何が変わるんしょう?
"usebackq tokens=*"と"usebackq delims="の使い分けと
les=%%~iとles=%%iの違いが解んないです

133:デフォルトの名無しさん
15/05/18 20:35:07.70 /17k7IVe.net
出力が
"c:\program files\aaa\bbb.exe"
みたいな空白を含み両端が""で囲まれている時に
%%iだと"c:\program files\aaa\bbb.exe"になり
%%~iだとc:\program files\aaa\bbb.exeになるという違いがあるから
受け取るのが数値を表した文字列の場合はどっちも一緒

134:デフォルトの名無しさん
15/05/18 22:47:45.42 clhkHSwG.net
for /f "tokens=*" %i in (" hoge") do echo %i

135:デフォルトの名無しさん
15/05/18 23:43:20.25 a89GM3eE.net
>>128
ちょっと確認とれないけど、言ってる意味はわかりました
ありがとうございます
>>129
スペースの有無で結果が変わりますね
違いがわかりました。ありがとうございます

136:デフォルトの名無しさん
15/05/20 17:18:51.87 /oDHFiER.net
条件に当てはまる複数のフォルダの移動を行いたいのですが上手く行きません。
ご助力をお願いいたします。
目的:任意フォルダ配下のサブフォルダから、行頭にの”[AAA]”があるフォルダのみを
別の任意フォルダに移動させたい。行頭文字には[ ]含みます。
移動元の親フォルダはd:\moto と仮定します。移動先フォルダはd:\saki とすると
処理したい該当するフォルダはd:\moto\[AAA]* となります。
set d_moto=d:\moto       /* 移動元親フォルダ*/
set d_saki=d:\saki       /* 移動先フォルダ*/
set path_moto=%d_moto%\[aaa]*  /* 移動の対象フォルダ*/
for /d %%f in (%path_moto%) do move %%f %d_saki%
該当サブフォルダまでsetしたのはこの他の箇所で使うので定義しています。
またfor /d %%f in (%d_saki%\[aaa]*) do move %%f %d_saki% でも構文エラーが出ます。
ワイルドカードの記述がよく判っておりません。

137:デフォルトの名無しさん
15/05/20 17:26:51.76 /oDHFiER.net
× set path_moto=%d_moto%\[aaa]*  /* 移動の対象フォルダ*/
○ set path_moto=%d_moto%\[AAA]*  /* 移動の対象フォルダ*/
失礼しました。上記レスには他にも誤字がありますがご勘弁願います。

138:デフォルトの名無しさん
15/05/20 17:41:33.73 Wa0xSOyJ.net
>>132
実行したとき、コマンドプロンプトにどういうメッセージが出てたのか分からないので想像になるが
多分半角空白が含まれるフォルダ名のところでエラーが出てるんじゃない?
%%f -> "%%~f"
%d_moto%と%d_saki%には半角空白が含まれる可能性がないとするなら上の変更でいいと思う
あと、パス名ファイル名に大文字小文字の区別はないので>>132の上も下も全く同じ


139:



140:デフォルトの名無しさん
15/05/20 19:23:26.75 /oDHFiER.net
>>133 レスありがとうございます。
for /d "%%~f" in (%path_moto%) do move "%%~f" %d_saki%
for /d "%%f" in (%path_moto%) do move "%%f" %d_saki%
どちらもダメでした。コマンドプロンプト・ウインドウ上でのエラー表示になりますが、
「"%~f" の使い方が誤っています。」と表示されます(又は"%f" )。
バッチでもエラーメッセージは表示されますが、バッチウインドウ自身が強制終了して
閉じてしまいバッチ上でのメッセージは確認出てきておりません(同じ内容だと思いますが)。
%環境変数%を使わないでコマンドプロンプト上でテストしてみると、行が変わって内部の
move文で半角スペースが有るため以下のパターンでは「コマンドの構文が誤っています。」と
表示されます。
for /d %~f in ("d:\moto\[AAA]*") do move %~f "d:\saki" ※%~f → %f でも
for /d %~f in ("d:\moto\[AAA]*") do move %~f d:\saki    同じ結果でした
for /d %~f in (d:\moto\[AAA]*) do move %~f d:\saki
後出しで恐縮ですがOSはWindows7 x64、アドミン&管理者モードで実行しています。

141:デフォルトの名無しさん
15/05/20 19:39:25.40 Wa0xSOyJ.net
>>134
ちゃんと説明しなかったけど、まあこう書けばヘルプ見て分かると思ったんだけど
for /d %%f in (%path_moto%) do move "%%~f" %d_saki%
for /?
pause /?

142:デフォルトの名無しさん
15/05/20 20:21:43.80 /oDHFiER.net
お手数をおかけしました。ヘルプ確認もしなかった事をお詫びいたします。
set d_moto=d:\moto            /* 移動元親フォルダ*/
set d_saki=d:\saki              /* 移動先フォルダ*/
set path_moto=%d_moto%\[aaa]*  /* 移動の対象フォルダ*/
for /d %%f in (%path_moto%*) do move "%%f" "%d_saki%"
で正常動作しました。setした際に行尾に\を入れていなかったためか、
%%~f ではコンソール画面が強制終了してしまいましたので、%%fにしております
ご回答とお付き合い頂き、ありがとうございました。

143:デフォルトの名無しさん
15/05/20 21:09:45.02 RmJGSs4fi
バッチにC言語みたいな注釈いれるなよ
まさかそのまま実行したのか?

144:デフォルトの名無しさん
15/05/21 08:17:34.17 xGT/OYAlF
>>136
> %%~f ではコンソール画面が強制終了してしまいましたので、%%fにしております

>>135 をよく見ろ。2個とも %%~f にしたら駄目だ

145:デフォルトの名無しさん
15/05/22 18:53:43.10 dDrrBwBt.net
ファイル名にファイルの更新日時を付けてやろうと
set I="F:¥hoge¥test.txt"
set tem1=%~tI
set tem2=%tem1:"/"=%
set tem3=%tem2:" "="-"%
set tem4=%tem3:":"=%
rename %I% test%tem4%.txt
としてみたのですがうまくいきませんでした。
何かいいアイデアをお願いします。

146:デフォルトの名無しさん
15/05/22 19:08:31.56 H1v/SBhd.net
for %%i in (%I%) do set temI=%%~tI

147:デフォルトの名無しさん
15/05/22 19:09:49.99 H1v/SBhd.net
修正(変数Iなんか使うから間違えた)
for %%i in (%I%) do set temI=%%~ti

148:デフォルトの名無しさん
15/05/22 19:57:31.64 rsRBQIIs.net
set I="F:\hoge\test.txt"
call :x %%I%%
goto :eof
:x
set "tem1=%~t1"
set "tem2=%tem1:/=%"
set "tem3=%tem2: =-%"
set "tem4=%tem3::=%"
rename "%~f1" "%~n1%tem4%%~x1"

149:デフォルトの名無しさん
15/05/22 20:29:14.08 dDrrBwBt.net
>>141, >>142
すげー
あんなに悩んでたのに一瞬で解決するなんて
ありがとう

150:デフォルトの名無しさん
15/05/23 01:08:59.65 idOG0Vl/.net
>>143
ご参考
大量にある、下位階層まで変更したい場合、
Flexible Renamer というフリーソフトもある

151:デフォルトの名無しさん
15/05/23 09:30:59.77 sl1qWZ50.net
>>144
d

152:デフォルトの名無しさん
15/05/23 09:45:09.89 EIZIQejy.net
>>144
> 大量にある、下位階層まで変更したい場合
>>141 の応用 (for /r) でいいだろ

153:デフォルトの名無しさん
15/05/30 17:32:47.82 KPmzF3IM.net
指定日時まで一定間隔で繰り返すバッチはこれで大丈夫ですか?
:RETAKE
set D=%DATE%
set T=%TIME: =0%
if not %D% == %DATE% goto RETAKE
set YYYYMMDDHHMMSS=%D:~-10,4%%D:~-5,2%%D:~-2%%T:~0,2%%T:~3,2%%T:~6,2%
:LOOP
   start "hoge" /wait "hoge.bat"
   if "%YYYYMMDDHHMMSS%"=="20150531000000"(
   goto NEXT
   ) else (
   ping localhost -n 600 > nul
   goto LOOP
   )
:NEXT

154:デフォルトの名無しさん
15/05/30 17:43:26.77 KWAqrQi+.net
そういうのは俺ならタスク(スケジューラ)を使うけど
jt.exeとかschtasksとか

155:デフォルトの名無しさん
15/05/30 19:41:05.67 h+FcqRuX.net
>>147
LOOP部分だけど、それだと指定日時に一致しない場合は延々ループし続ける
AよりBが小さいのようにGEQやLEQなどの比較演算子のほうがよさそう
if %YYYYMMDDHHMMSS% LSS 20150531000000 (
数値比較の場合はダブルクォートは外したほうがいい

156:デフォルトの名無しさん
15/05/30 20:49:16.17 elL7Ij3fn
>>149
高々32ビット整数しか演算出来ないのに
そんなの、まともに比較出来ると思うのか?

157:デフォルトの名無しさん
15/05/30 20:55:20.63 NQWNmwnG.net
高々32ビット整数しか演算出来ないのに
そんなの、まともに比較出来ると思うのか?

158:デフォルトの名無しさん
15/05/30 21:09:00.59 NQWNmwnG.net
試してみろ
if 20150530999999 LSS 20150531000000 echo aho
if "20150530999999" LSS "20150531000000" echo baka

159:デフォルトの名無しさん
15/05/31 01:38:25.44 jBtv10qY.net
>>147
日時判定のif文を二段階にしたら
最初年月日で、次に時分秒で

160:デフォルトの名無しさん
15/05/31 03:52:31.64 6BGakI3g.net
ダブルクォートを外さなければ問題ないんじゃね
数字だけだと数値比較、それ以外は文字列比較
32ビット整数を超える数値なら文字列比較で

161:デフォルトの名無しさん
15/05/31 04:52:13.09 ntMrQIQA.net
:LOOP
  if "%date%"=="2015/05/31" goto NEXT
  start "hoge" /wait "hoge.bat"
  ping localhost -n 600 > nul
  goto LOOP
:NEXT
でよくね
厳密にやりたかったら日時型すらないバッチなんぞ捨ててしまえ

162:デフォルトの名無しさん
15/06/02 11:53:10.99 kNAcHIfI.net
特定のフォルダ配下の空のフォルダだけを抽出して処理したいのですが上手く行きません。
特定のフォルダ配下の子フォルダの中身にはどんなファイル、孫にあたるサブフォルダ(※1)、とも存在しない物だけが
本処理対象(退避場所へ移動させる)となります。
※1 サブフォルダは存在してても中身が空の物は”例外処理(フォルダの削除)”の対象とします。
一言でフォルダの中身が空と行っても子フォルダとサブ以下では処理が異なります。子は本処理、孫以下は例外。
d:\temp
 ├aaa(ファイルはあり)-aaa1(ファイルは空)-aaa2(ファイルは空)
 ├bbb(ファイルは空)-bbb1(ファイルはあり)
 ├ccc(ファイルは空)-ccc1(ファイルは空)
 ├ddd(ファイルはあり)
 ├eee(ファイルは空)
 ├fff(ファイルは空)-fff1(ファイルは空)-fff2(ファイルはあり)
 ├ggg(ファイルはあり)-ggg1(ファイルはあり)-ggg2(ファイルは空)
本処理対象 :eee
例外処理対象:aaa1,aaa2,ccc,ccc1,ggg2 
処理対象外 :aaa,bbb1(bbb毎),ddd,fff2(fff fff1毎),ggg(ggg1毎)
(つづく)

163:デフォルトの名無しさん
15/06/02 11:56:57.04 kNAcHIfI.net
set dir_path=d:\temp
set cnt=1
loop-st:
if cnt==5 goto loop-end
for /d /r %dir_path% %%D in (\*) do ( //サブフォルダを含む指定配下のフォルダの全リストを取得
if not exist "%%D\*nul" ( //サブフォルダが無い場合対象とする
  for %%S in (%%D\*.*) do (    //さらに中にファイルが存在し無ければ本処理対象 ※2
     本処理
    )
 ) else (
   for %%S in (%%D\*.*) do (    //さらに中にファイルが存在し無ければ本処理対象 ※2
     例外処理
  )
)
set /a cnt=%cnt%+1
:loop-end
って感じで記述したのですが※2で「無ければ」の書き方判らなくて情け無い事に断念。if not exitですと
*.*指定をするとバッチが落ちる(コマンドプロンプト窓が強制的に終了しエラーも確認しにくい)ため上手く行きません。
またfor文の中で強引に goto とラベルを記載するやり方はエラー(※2)となりました。
※2 ()の使い方…と表示してたのは確認出来ました。
なおフォルダの階層は最大4です。aaa2は階層3となります。また上記では例外中の例外なcccに対してもまだ未対応です。
cccは子フォルダですが、空のサブフォルダしかないパターンで本来あってはいけないフォルダとなりますので
例外処理行き(ccc,ccc1共に削除)です
batでは困難でしょうか?正解コーデングのご呈示をお願い申し上げます。

164:デフォルトの名無しさん
15/06/02 19:30:38.92 KyjHTQN8.net
>>157
eeeの本処理(退避場所に移動させる)って言うけど
eeeはファイルのフォルダも無い空のフォルダだよね?
退避させる意味あるの?

165:デフォルトの名無しさん
15/06/02 21:40:21.15 KyjHTQN8.net
@echo off
pushd d:\temp
set bak=c:\bak
set level=-1
call :sub "z:\test" proc1
call :sub "z:\test" proc2
popd
goto :eof
:sub
setlocal
if "%2" neq "" set proc=%2
pushd %1
set /a level+=1
if %level% lss 5 (
for /d %%i in (*.*) do (call :sub %%i)
) else (goto :eof)
set cnt=0
for /d %%i in (*.*) do set /a cnt+=1
for %%i in (*.*) do set /a cnt+=1
popd
call :%proc% %1 %level% %cnt%
endlocal
goto :eof
:proc1
if %2 equ 1 if %3 equ 0 md %bak%\%1 2>nul&rd %1
goto :eof
:proc2
if %3 equ 0 rd /s/q %1
goto :eof


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

1839日前に更新/325 KB
担当:undef