トップページ⇒tech
1001コメント273KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/04/21(土) 22:37:58.49
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %8 【.bat】
http://toro.2ch.net/test/read.cgi/tech/1315844420/

【.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/
0002デフォルトの名無しさん2012/04/21(土) 22:42:13.45
>>1乙
0003デフォルトの名無しさん2012/04/21(土) 22:45:04.45
>すれ立て間違えたw
ほらみろ
0004デフォルトの名無しさん2012/04/21(土) 22:46:15.83
バッチファイル処理を強化する
ライブラリを作ろう。
0005デフォルトの名無しさん2012/04/21(土) 23:35:46.52
これ以上駄作ふやすなよ
0006デフォルトの名無しさん2012/04/22(日) 12:01:47.42
@echo >>1乙
0007デフォルトの名無しさん2012/04/22(日) 13:22:07.65
>>6
初心者乙

@echo ^>^>1乙
0008デフォルトの名無しさん2012/04/22(日) 13:52:39.88
>dir
2012/04/22 12:01:47 21 1乙

0009デフォルトの名無しさん2012/04/26(木) 20:25:04.13
for /d %%i in (c:\*) do if XXX (exec1 "%%~i") else (exec2 "%%~2")
でXXXの条件が%%iがsで終わっていたらというのにしたいんですがどうすればいいですか?

c:\windows, c:\usersなどはexec1
それ以外ならexec2に分岐したいのです
0010デフォルトの名無しさん2012/04/26(木) 22:01:31.72
一度何かの変数に入れるしかないな
0011デフォルトの名無しさん2012/04/26(木) 22:22:55.38
findstrをかませるんだな
0012デフォルトの名無しさん2012/04/26(木) 23:30:31.05
for /d %%i in (c:\*) do (
set s="%%~i"
call :sub "%%~i"
)
exit
:sub
if "%s:~-2%=="s" (exec1 "%~1") else (exec2 "%~1")
exit /b
0013デフォルトの名無しさん2012/04/27(金) 13:48:36.22
for /d %%i in (c:\*) do (echo %%i)|findstr /e "s" && (exec1 "%%~i") || (exec2 "%%~2")
0014デフォルトの名無しさん2012/04/27(金) 22:03:54.88
俺様の力作バッチを皆に恵んであげよう

pushd X:\エロ画像 || goto :eof

rem カレントディレクトリのファイルをMD5ハッシュ値にリネーム 要md5sum
for %%i in (*) do for /f "usebackq delims= " %%j in (`md5sum "%%~i"`) do ren "%%~i" "@%%j%%~xi"

rem 16個のサブフォルダに振り分け
for %%i in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (mkdir @%%i&move @%%i*.* @%%i\)

mkdir 重複&move *.* 重複\

rem 画像をランダムに開く 要ruby
ruby -x "%~f0"

popd
goto :eof

#!ruby
`dir /s /b /a:-d`.split("\n").shuffle.each{|i| `start "" "#{i}"`; gets}
0015デフォルトの名無しさん2012/04/28(土) 02:33:34.78
おー凄い、馬力作バッチ
0016デフォルトの名無しさん2012/04/29(日) 06:35:51.06
ばか 作 ぱっち
0017デフォルトの名無しさん2012/04/29(日) 11:05:59.71
@がキモい
0018デフォルトの名無しさん2012/04/30(月) 23:11:04.33
コマンドプロンプトでバッチの引数に「^^"&time /t」を指定したとして、
これを変数に格納する事ってできますか?

C:\>a.bat ^^"&time /t

『a.bat』
================================
@echo on
set AAA=%1
set AAA=%~1
set "AAA=%1"
set "AAA=%~1"
================================

結果
================================
C:\>set AAA=" & time /t
23:08
C:\>set AAA=" & time /t
23:08
C:\>set "AAA=^" & time /t"
23:08
C:\>set "AAA=^" & time /t"
23:08
================================
0019デフォルトの名無しさん2012/05/01(火) 13:51:05.53
パス
0020デフォルトの名無しさん2012/05/03(木) 15:46:04.57
for /r %i (*) do @echo.%i
とやると途中からecho %i.%iとやったのと同じになるんですが
誰か理由わかりますか?
0021デフォルトの名無しさん2012/05/03(木) 15:50:14.86
echo %i.%i
じゃなくて
echo %i.[表示がおかしくなる直前のファイル名]
みたいな感じになってました
0022デフォルトの名無しさん2012/05/03(木) 16:30:17.03
コンソールのゴミじゃなくて?
ファイルにリダイレクトしても?
0023デフォルトの名無しさん2012/05/03(木) 17:14:44.71
ファイルに書いても一緒です。
十数行までは普通に出るんですが、途中からおかしくなる。
0024デフォルトの名無しさん2012/05/03(木) 17:25:11.77
バッファのゴミだろね
%~fi
はどう?
0025デフォルトの名無しさん2012/05/03(木) 17:54:55.42
同様です。

わからないのは
echo %i では問題ないのに
echo.%i 他スペース以外だと二重になってしまうことです。

この辺の理屈が知りたい。
0026デフォルトの名無しさん2012/05/03(木) 18:49:34.22
必要ないのに.なんかつけるから反感買って嫌がらせじゃないか
0027デフォルトの名無しさん2012/05/03(木) 18:52:31.26
おれっちじゃ再現しないな
osのよるんじゃね?
0028デフォルトの名無しさん2012/05/03(木) 19:07:47.32
>>26
%iが空白だったときに echo は ONです っての見たくないから
ピリオド打つの癖になってるもんで。
0029デフォルトの名無しさん2012/05/03(木) 19:18:08.15
for %i in (*) do @echo\a
とかでもおかしい表示になってたのにデバッガ開いたら正常になった
原因はfor臭い
0030デフォルトの名無しさん2012/05/03(木) 19:23:35.98
>>22
XPでよくコマンドプロンプト表示がバグることがあるけど、
あれのMS公式見解ってないのかね?
エンドユーザにPCの情報採取してもらうのに
dir/a|findstr ほにゃらら
とかやらせて、DOS窓のスクショを送ってもらうんだけど
前にコンソール表示のバグらしき事象に騙されたことがあったんだけど、
リダイレクトで万が一既存ファイルを上書いてしまうリスクを考えると、
エンドユーザにリダイレクトはさせたくないんですよね
0031デフォルトの名無しさん2012/05/03(木) 19:26:59.27
| clip
ならよかんべ
0032デフォルトの名無しさん2012/05/03(木) 19:31:38.85
>>28
ピリオドはやめとけ
echo > echo.txt
for %i in (txt) do @echo.%i
0033デフォルトの名無しさん2012/05/03(木) 19:34:57.69
>>28
\もやめとけ
md echo
echo >echo\aaa.txt
for %i in (aaa.txt) do @echo\%i
0034デフォルトの名無しさん2012/05/03(木) 20:08:24.03
echoで改行だけを出力する時困り申す
0035デフォルトの名無しさん2012/05/03(木) 20:14:10.01
http://scripting.cocolog-nifty.com/blog/2008/11/echo-3741.html
0036デフォルトの名無しさん2012/05/05(土) 00:00:21.17
>>18は無理なのかな。
0037デフォルトの名無しさん2012/05/05(土) 01:15:10.65
CMDCMDLINE
0038デフォルトの名無しさん2012/05/05(土) 01:50:32.71
無理無駄無用
0039デフォルトの名無しさん2012/05/05(土) 22:12:33.58
%*
0040デフォルトの名無しさん2012/05/26(土) 11:26:56.87
プログラムを実行したときにプログラム内の処理でキー入力させられるものがありますが
それらをbatファイルから入力させることは可能でしょうか?
0041デフォルトの名無しさん2012/05/26(土) 12:42:34.47
>>40
SET /? をよく読むんだ
0042デフォルトの名無しさん2012/05/26(土) 14:51:14.05
setって変数を宣言するものですよね?
コマンドプロンプトで動作するプログラム(mysqlとかsqlite3)を実行中に標準入力を受け付けてるところに指定した文字列を入力したいだけなんですが

set pass=1234
mysql -u root -p
REM パスワード入力
REM ここでパスワード入力待ちになる
REM ここで変数passを入力したい
0043デフォルトの名無しさん2012/05/26(土) 15:05:15.12
ああ、そっちか
標準入力のリダイレクトでダメなら、バッチファイルだけでは辛いかも
0044デフォルトの名無しさん2012/05/26(土) 18:16:39.01
お前には無理
0045デフォルトの名無しさん2012/05/27(日) 07:50:43.58
>>42
set pass=1234
echo pass|mysql -u root -p
ではどうですか?
0046デフォルトの名無しさん2012/05/27(日) 10:48:16.26
>>45
試してみたのですが入力されませんでした
0047デフォルトの名無しさん2012/05/27(日) 11:32:20.43
>>46
バッチファイルにパスワードを晒すぐらいなら、普通に
mysql -u root --password=1234
でやれよw
0048デフォルトの名無しさん2012/05/27(日) 12:18:47.20
パスワードだけでなくその後にsqlも実行したいのです・・・
0049デフォルトの名無しさん2012/05/27(日) 12:34:45.05
それならこれでいいだろ
mysql -u root -pパスワード データベース名 < hoge.sql
0050デフォルトの名無しさん2012/05/27(日) 13:45:14.71
そうなると標準入力へはできないってことですか?
0051デフォルトの名無しさん2012/05/27(日) 15:15:53.18
そこまで意欲的に質問する暇があったらググれ
0052デフォルトの名無しさん2012/05/27(日) 15:44:07.22
どうもググってもbatファイルできるような記事が見当たらず・・・
別の所で聞いてきます
0053デフォルトの名無しさん2012/05/27(日) 15:48:56.09
翻訳:ググるよ面倒なので他人を利用するぞ
0054452012/05/27(日) 16:10:13.24
>>46
ごめん環境変数は参照時は%で括るんだったorz
set pass=1234
echo %pass%|mysql -u root -p
0055デフォルトの名無しさん2012/05/28(月) 15:47:33.84
autohotkeyとか使っとけよ
セキュリティgdgdになるけど
0056デフォルトの名無しさん2012/05/28(月) 18:24:18.67
おまえらど素人をあんまり甚振るなよ
>>41が答えだろ
set /p pass=enter password
mysql -u root --password=%pass%
0057デフォルトの名無しさん2012/05/29(火) 00:38:44.56
>>41-43の流れだと対話的に入力させたいわけではなく、対話型プログラムを自動化したいって意味だと思うが?
まあ>>40が不明瞭だしその後のレスも結局何がしたいのか説明できていないが
0058デフォルトの名無しさん2012/05/29(火) 01:50:20.43
>>54
set /?
を,見ればすぐ分かることを仕込んでどんな相手なのか判断してたのかと
思って読んでたよw
0059デフォルトの名無しさん2012/05/29(火) 02:18:43.40
どうみても釣だろ
0060デフォルトの名無しさん2012/06/13(水) 18:47:03.35
ある時刻になったら stop ってコマンドを自動で入力させることってできる?
0061デフォルトの名無しさん2012/06/13(水) 21:07:40.69
質問になってませんね
0062デフォルトの名無しさん2012/06/13(水) 22:10:33.28
at
0063デフォルトの名無しさん2012/06/21(木) 02:28:07.82
質問です。
大量にデータがあるファイル内の[開始文字列]と[終了文字列範囲内]の文字を抽出するにはどうしたらいいのでしょうか。

分かりやすく例えますと、htmlファイル内の
検索範囲開始文字列:http
から
検索範囲終了文字列:.html
までをファイルに追記書き出しすると言うほうが分かりやすいでしょうか。

通常のhtmlファイル内には複数のURLがあるので、
私が指定している方法ですと、htmlファイル内のURLが
指定ファイルに列挙される形になります。

結果のファイルサンプルです。
----------result.txt----------
http://hogehoge.com/index.html
http://hogehoge.com/hello_world.html
http://hogehoge.com/hogehoge.html
http://hogehoge.co.jp/index.html
http://hogehoge.co.jp/programming.html
http://hogehoge.co.jp/debughtml
------------------------------

外部コマンドラインツールを利用してもOKです。
0064デフォルトの名無しさん2012/06/21(木) 02:31:11.43
そして、>>42ですが、
set pass=1234
mysql -u root -p
mysqlが パスワード入力 ルーチンロード
mysqlがユーザからのパスワード入力を待機
ここでmysqlに%pass%のデータを送信させる。(ようするにパイプ)

じゃないかなって思います。
0065デフォルトの名無しさん2012/06/22(金) 22:15:57.46
>>63
for/?
set/?
if/?
echo/?
0066デフォルトの名無しさん2012/06/23(土) 01:04:24.75
>>65
Split.CMD
というバッチファイルをダウンロードしてきて
やってみたのですが、指定された文字を含む行が表示されるだけで
開始文字列から終了文字列まで、などの指定で一部分を切り出す事ができませんでした。。
0067デフォルトの名無しさん2012/06/23(土) 06:13:58.31
そのやる気のなさと知識レベルだと、教えてもらってもだめだろうから、
素直にあきらめるがよろし。
0068デフォルトの名無しさん2012/06/23(土) 19:56:00.92
それよくあるバグだな
@ECHO OFF
REM 使用法: 切り出し.CMD 開始文字列 終了文字列 ファイル
SETLOCAL ENABLEDELAYEDEXPANSION
(FOR /F "delims=[] tokens=1*" %%0 IN ('FIND /N /V ""') DO (
IF "!FLAG!"=="1" SET FLAG=2
IF "!FLAG!"=="3" SET FLAG=4
SET "LINE=%%1"
if defined line SET "LINE=!LINE:%1=!"
if defined line IF NOT "!LINE!"=="%%1" SET FLAG=1
SET "LINE=%%1"
if defined line SET "LINE=!LINE:%2=!"
if defined line IF NOT "!LINE!"=="%%1" SET FLAG=3
IF "!FLAG!"=="1" ECHO=%%1
IF "!FLAG!"=="3" ECHO=%%1
IF "!FLAG!"=="3" GOTO :EOF
IF "!FLAG!"=="2" ECHO=%%1
)
)<%3
0069デフォルトの名無しさん2012/06/23(土) 23:25:47.79
レスありがとうございます。

C:\TEST>切り出し-2chTEST.CMD 234 789 test.txt
1234567890

C:\TEST>

testファイルの中身です。
-----test.txt-----
HelloWorld
サンプルです
1234567890
Sample
[EOF]
---------------------------

どうも23456789と切り出ししてくれなくて困ってます。
0070デフォルトの名無しさん2012/06/24(日) 00:06:38.11
用途が違うな
0071デフォルトの名無しさん2012/06/24(日) 00:12:02.93
for
find
set
echo
で作れ
0072デフォルトの名無しさん2012/06/24(日) 07:56:08.12
>>69
どっちにしろ、! を含むファイルでおかしくなるとかあるから、素直にあきらめて
vbs とかでやれよ。
0073デフォルトの名無しさん2012/06/24(日) 19:08:22.13
console2が結構まともに動くと思ったけどヒストリなしか。
なかなかこれといったcmd, powershellがまともに動くマルチタブのターミナルが出てこないな。
0074デフォルトの名無しさん2012/06/26(火) 18:12:31.62
>>72
はい。そうしてみます。
ありがとうございました。
0075デフォルトの名無しさん2012/06/30(土) 15:34:24.45
指定したディレクトリ以下にあるファイル名にスペースがあったらすべてアンダーバーに置き換える
バッチお願いします
0076デフォルトの名無しさん2012/06/30(土) 15:50:19.40
> 拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
> 質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

丸投げするスレじゃないぞ。

あと、個人的には...

> ※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。

の方がいいと思う、バッチで文字列操作は結構トラップ多いから。
0077デフォルトの名無しさん2012/06/30(土) 15:51:32.15
pushd %1 && for %%I in ("* *") do (
set xxx="%%~I"
call ren "%%~I" %%xxx: =_%%
)
0078デフォルトの名無しさん2012/06/30(土) 16:47:01.97
>>77
ありがとうございます
これをサブフォルダ内まで効果を及ばせるのって可能でしょうか
0079デフォルトの名無しさん2012/06/30(土) 21:10:04.77
pushd %1 && for /r %%I in ("* *") do (
set xxx="%%~nxI"
call ren "%%~I" %%xxx: =_%%
)
0080デフォルトの名無しさん2012/06/30(土) 22:14:41.84
/rを追加でできるんですね、覚えておきます
ありがとうございました
0081デフォルトの名無しさん2012/07/05(木) 03:05:34.99
質問なんですがちょっと長いです、申し訳ないです

C:\a\とD:\a\内のfile.datの更新日時を比較して、C:\a\file.datのほうが新しい場合、それをD:\a\にコピーするバッチを作りました

00 for %%c in (C:\a\file.dat) do set cdate=%%~tc
01 set cdate=%cdate:~2,2%%cdate:~5,2%%cdate:~8,2%%cdate:~11,2%%cdate:~14,2%
02 for %%d in (D:\a\file.dat) do set ddate=%%~td
03 set ddate=%ddate:~2,2%%ddate:~5,2%%ddate:~8,2%%ddate:~11,2%%ddate:~14,2%
04 if %cdate% GTR %ddate% xcopy "C:\a\file.dat" "D:\a\" /e /y

00で更新日時を取得して、01で「2012/07/05 02:36」を「1207050236」に変換します
02と03も同じようなことをして、04で比較とコピーを行います


それで今回、フォルダbやcなどが増えそうなので、folders.txtに名前を書かれたフォルダ全てを扱うためのバッチを作り直したのですが、
これがよく分からんのですが思ったように動きません
作り直したと言ってもFOR文をネストしただけなのですが

00 for /f %%f in (C:\folders.txt) (
01 for %%c in (C:\%%f\file.dat) do set cdate=%%~tc
02 set cdate=%cdate:~2,2%%cdate:~5,2%%cdate:~8,2%%cdate:~11,2%%cdate:~14,2%
03 for %%d in (D:\%%f\file.dat) do set ddate=%%~td
04 set ddate=%ddate:~2,2%%ddate:~5,2%%ddate:~8,2%%ddate:~11,2%%ddate:~14,2%
05 if %cdate% GTR %ddate% xcopy "C:\%%f\file.dat" "D:\%%f\" /e /y
06 )

05を伏せる代わりにpauseを入れて観察したところ、01と03に問題があるようで、file.datを見つけられていないようでした
少し粘ったのですが無理そうなので、「他の方法」を使いたいのですが、私の知識は浅すぎて皆目検討がつきません
そこで皆さんに「他の方法」を教えていただきたいのです。どうかよろしくお願いしますm(_ _)m
0082デフォルトの名無しさん2012/07/05(木) 03:17:23.65
robocopy
0083デフォルトの名無しさん2012/07/05(木) 03:36:21.24
xcopy /d
setlocal
0084デフォルトの名無しさん2012/07/05(木) 14:20:02.17
>>82
>>83
robocopyなんて便利なものがあったとは・・・目から鱗です
本当にありがとうございましたm(_ _)m
0085初心者さん2012/07/05(木) 18:27:23.50
@echo off
:loop
set /a p = p + 1
ping localhost -n 1 > nul
cls
echo %p%%%
if /i "%p%"=="100" goto:f
goto :loop
:f
echo finish
0086デフォルトの名無しさん2012/07/10(火) 20:04:55.55
調べ方がわからないのでここにたどり着きました

フォルダ内にあるファイルをアクロバットリーダーを使って印刷するバッチです
印刷は出来るのですがpdf以外のファイルがあるとエラーが出て
それが大量なのでいまいち使いづらいです
pdfのみに絞るもしくは、他のファイルは無視をする方法教えてくれませんか

〜〜〜〜〜〜〜〜〜〜〜〜
for %%i in (*) do (
START ACRORD32.EXE /n /t %%i
)
〜〜〜〜〜〜〜〜〜〜〜〜
0087デフォルトの名無しさん2012/07/10(火) 20:19:02.99
for %%i in (*.pdf) do (
START ACRORD32.EXE /n /t %%i
)
0088デフォルトの名無しさん2012/07/10(火) 22:05:30.31
>>87 ありがとうございます;;
0089デフォルトの名無しさん2012/07/14(土) 13:04:36.13
自分自身がUACの管理者承認モードで
動いてることを検出できるバッチファイルの作り方おしえれ
0090デフォルトの名無しさん2012/07/14(土) 15:04:20.91
title /?
0091デフォルトの名無しさん2012/07/14(土) 17:34:05.47
バッチファイルで、「管理者として実行」されているか?「整合性レベル:低」か?を判定する。(その2)
0092デフォルトの名無しさん2012/07/14(土) 17:41:16.31
titleに付けないようにできるからな
0093デフォルトの名無しさん2012/07/18(水) 16:59:27.47
異なる拡張子のファイルを複数バッチに投げたときに
拡張子ごとのファイルパスをsetする方法を教えてください
0094デフォルトの名無しさん2012/07/18(水) 21:32:19.99
for %%I in (%*) do echo %%~xI
あとは自分で考えろバカ
0095デフォルトの名無しさん2012/07/19(木) 21:44:23.72
>>94
ありがとう
バカですんません
0096デフォルトの名無しさん2012/07/20(金) 08:19:03.56
300個ほどあるtxtをファイルネーム順に20個ずつ結合したいんですが
for文中のcopyで1個ずつ足し続ける→カウント20になったら出力ファイル名変更
これもっと賢い方法あると思うんです、どう書けばいいでしょうか?
0097デフォルトの名無しさん2012/07/21(土) 01:50:31.10
ない
0098デフォルトの名無しさん2012/07/21(土) 04:18:40.67
for文中のrenで1個ずつファイル名末尾に識別子を足し続ける→カウント20になったら識別子変更
copy *識別子.txt group識別子.txt
これで入出力が1回ですんで時間短縮になりました
0099デフォルトの名無しさん2012/07/21(土) 16:37:15.19
はあ?あほか なわけない
0100デフォルトの名無しさん2012/07/21(土) 16:39:53.52
いったいどこのioが減ったと思ってるの?おばかさん
0101デフォルトの名無しさん2012/07/22(日) 00:30:28.46
ファイル名を変更するioが増えるわな
■ このスレッドは過去ログ倉庫に格納されています