for /f "delims=" %%a in ('dir /ad /b ^| findstr /b /r ""10月15日"|"10月16日""') do call :SUB "%%~a" pause exit /b :SUB rem set s=%~1 rem ren %1 "%s:~0,2%%s:~3,2%%s:~6%"
まともな正規表現を使いたければvbsやPowerShell、Perlとか別のスクリプトに行ったほうがいい バッチだと"&"や"%"とかダメ文字があるし凝った事をやろうとするといずれ行き詰まる 急がば回れ 0228デフォルトの名無しさん2017/10/17(火) 22:45:54.56ID:bWF1v8hX 参考にWSHでもどうぞ(hoge.jsファイルとして作成)、コマンドプロンプトから hoge "フォルダ名" (又は cscript //nologo hoge.js "フォルダ名") 又は、エクスプローラ等からフォルダをこのjsファイル(又はショートカット)にドロップして実行 var fso = new ActiveXObject("Scripting.FileSystemObject"); var args = WScript.Arguments; if(args.length<1) throw Error("引数にフォルダを指定してください"); if(!fso.FolderExists(args(0))) throw Error("指定のフォルダが存在しません"); var folder = fso.GetFolder(args(0)), s = "", success = [], fail = [], name, name2, em, i, r; var re = /^(\d{1,2})月(\d{1,2})日(.*)$/; var func_new_name = function(all,mm,dd,ss) { if(mm<1 || mm>12 || dd<1 || dd>31) return ""; return ("0"+mm).substr(mm.length-1) + ("0"+dd).substr(dd.length-1) + ss; }; em = new Enumerator(folder.SubFolders); for(em.moveFirst();!em.atEnd();em.moveNext()) { name = em.item().Name; if(re.test(name)) { name2 = name.replace(re,func_new_name); if(name2) { try{em.item().Name = name2; success.push(" "+name+" -> "+name2);} catch(e) {fail.push(" "+name+" -> "+name2);} } } } if(success.length>0) s = "リネーム成功\n"+success.join("\n"); if(fail.length>0) s += "\nリネーム失敗\n"+fail.join("\n"); WScript.Echo(s || "対象フォルダなし"); 0229デフォルトの名無しさん2017/10/17(火) 23:49:36.84ID:G9wCIPXR もうPowerShellのRename-Item使おうぜ 個人用途だろうし制約ないでしょ 0230デフォルトの名無しさん2017/10/18(水) 02:49:24.30ID:nuzaMfIv 覚えたてによく居るよね 要件無視した勝手な仕様でエラー判定とか結果ダイアログとかゴテゴテ実装してドヤ顔で持ってきちゃう子 0231デフォルトの名無しさん2017/10/18(水) 02:57:26.06ID:O0s7d+Fx まあダブルクリックで不意に実行されちゃうようなのは作りたくないよな 0232デフォルトの名無しさん2017/10/18(水) 07:04:24.46ID:G1+K6kx+>>215 無理やりバッチファイルの例
for /d %%i in (*) do set "a=%%~nxi" & call :w goto :eof :w setlocal enabledelayedexpansion set "e=m" & set /a b=0,m=0,d=0 :x set "c=!a:~%b%,1!" if not defined c goto :eof for /L %%j in (0,1,9) do if "!c!"=="%%j" set /a !e!=!e!*10+c & goto y if not "!c!"=="月" goto z if not "!e!"=="m" goto :eof if !m! gtr 12 goto :eof set "e=d" :y set /a b+=1 & goto x :z if not "!c!"=="日" goto :eof if not "!e!"=="d" goto :eof if !d! gtr 31 goto :eof set /a f=m*d,m+=100,d+=100,b+=1 if !f! gtr 0 ren "!a!" "!m:~1!!d:~1!!a:~%b%!" 0233デフォルトの名無しさん2017/10/18(水) 22:17:20.50ID:on6I0HDV>>231 うちの現場のバッチは例え内部で使わなかろうが最低1つは必ず引数を渡す仕様になってる。 そしてそれが渡されなかった場合は処理せずに終了する作りになっている。 理由は誤ってダブクリしちゃった場合の対策なんだってさ。 0234デフォルトの名無しさん2017/10/18(水) 22:23:22.61ID:hY2xT5yc batって大体はD&Dして使うようなの書いてるな 0235デフォルトの名無しさん2017/10/19(木) 01:03:03.64ID:cgLUQcTs>>230 なんか癇に障ったみたいだけど、言い訳すると 俺は、質問者によって回答内容を変えてる 今回の質問者は初心者だと感じたし、さらには細かい拘りを持っているように見受けられた (13月32日なんて作らないだろうし、もしあったって1332に変換されて悪いことはないと思う) 色々と手を加えて試行錯誤することが好きなんだろうなって思ったから 役に立ちそうな追加部分を記述した それに1レスで書く分には、数行増えようが関係ないだろうと思ったしね 0236デフォルトの名無しさん2017/10/19(木) 08:32:22.21ID:ny4cf+Vz>>233 なるほど 0237デフォルトの名無しさん2017/10/19(木) 22:12:55.60ID:JROgBEvY ザ・ワールド、時よ止まれ。 0238デフォルトの名無しさん2017/10/20(金) 03:00:35.66ID:1Na2h1P4 キッティングの自動化をしたいんだが、参考になるサイトない? 0239デフォルトの名無しさん2017/10/20(金) 03:00:59.71ID:1Na2h1P4 対象のレジストリ見つけるとかめんどい 0240デフォルトの名無しさん2017/10/20(金) 23:41:00.84ID:aZN6SiIl どの程度の自動化? 0241デフォルトの名無しさん2017/10/21(土) 08:56:40.19ID:Nsvn2WYb>>238 何を自動化するん? 0242デフォルトの名無しさん2017/10/21(土) 16:42:48.10ID:DofUW9OG そんなんツールが出てるんだからその説明でも読めよ 0243デフォルトの名無しさん2017/10/21(土) 18:43:14.12ID:TBS9tbdH 一発で、ファイアウォールの受信規則とかインターネットオプションとか 0244名無しさん@そうだ選挙に行こう! Go to vote!2017/10/22(日) 07:51:26.89ID:eb/3UN8i>>215 $before = ls -Directory | Where-Object { $_ -match "^\d+月\d+日" } $after = $before | foreach { $_.Name -replace '^(\d+)月(\d+)日', '$1$2' }
どうもありがとうございます。助かりました! 0255デフォルトの名無しさん2017/11/04(土) 18:30:41.27ID:sTeHaJ1X>>254 >>252-253に書いてあるけど事前にクライアント側の設定しないとtasklist /sでプロセス情報見れないけど、そこは大丈夫なの? 0256デフォルトの名無しさん2017/11/05(日) 10:20:45.02ID:rFS24mxQ set infilenm=001.txt set outfilenm=002.txt set beforestr="""" set afterstr="" type nul >%outfilenm% setlocal enabledelayedexpansion for /f "delims=" %%A in (%infilenm%) do ( set line=%%A echo !line:%beforestr%=%afterstr%!>>%outfilenm% ) endlocal
001.txtからダブルクォーテーションを削除して002.txtに保存したいだけなんですが、 3行目と4行目の表記がわからず、考えられる限り書き直して、うまくいきません。 あるいは別のBATでもいいのですが教えてください。 0257デフォルトの名無しさん2017/11/05(日) 11:42:01.62ID:vm51NJQ8>>256 set beforestr=^^" set afterstr=^^ でどうかな? 0258デフォルトの名無しさん2017/11/05(日) 11:56:26.30ID:vm51NJQ8 ただ001.txtのデータ次第でうまくいかない場合があるんで 別のスクリプト言語(PowerShellやWSH等)で書いたほうがいい 02592562017/11/05(日) 12:18:29.39ID:rFS24mxQ>>257 >>258 素早いお答えありがとうございます。
for /f "delims=" %%i in (1.txt) do ( set a=%%i setlocal enabledelayedexpansion echo !a:^"=!>>2.txt endlocal ) 0263デフォルトの名無しさん2017/11/06(月) 15:59:22.60ID:K1roLwuw 半角スペースだけの行は化けるな 0264デフォルトの名無しさん2017/11/06(月) 19:12:27.47ID:Mdq5cGE3 echo,とか、echo;とかで 0265デフォルトの名無しさん2017/11/06(月) 23:15:25.56ID:RrRem/45 バッチファイルに渡された引数が1つなのか2つなのかを判定したいのですが どのように記述すれば良いのでしょうか? 以下ではダメでした。
if defined %2 echo 引数は2つです else echo 引数は1つです 0266デフォルトの名無しさん2017/11/07(火) 01:14:40.14ID:xsgE2wk0 if not '%2==' 0267デフォルトの名無しさん2017/11/07(火) 07:09:27.79ID:4pg/kk0r>>264 ありがとう
for /f "delims=" %%i in (001.txt) do ( set "a=%%i" setlocal enabledelayedexpansion set "a=!a:"=!" echo.!a!>>002.txt endlocal )