[過去ログ] 【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
221(1): 2017/10/16(月)23:49 ID:1IRdIkAf(2/3) AAS
環境変数の評価を遅延させる方法はつまり
%%temp%%と%^temp%との2通り書けるわけだ
(結果的に同じになるけど動作は違う)
222: 2017/10/16(月)23:57 ID:1IRdIkAf(3/3) AAS
>>221
これはコマンドプロンプトでのことでbatに書くときはダメだね
223: 2017/10/17(火)00:03 ID:bWF1v8hX(1/2) AAS
評価と展開がごっちゃになってる
俺の理解が浅い(忘れっぽい)せいだな
224: 2017/10/17(火)07:18 ID:3NFRyYoM(1) AAS
ここで言ってる遅延と、いわゆる「遅延展開」は別物ですか?
225(1): 2017/10/17(火)09:05 ID:fpIKg5e5(1/2) AAS
>>218
>Month部分は、1 2 3...10 11 12、なら[1-12]
[]は文字集合。[]内の文字のうち何れか1文字という意味。文字列は扱えない
[1-12]だと"1-1"と"2"という意味で1か2になる
01-12月、01-31日を表すのなら [01][0-9]月[0-3][0-9]日
[01]が0か1で十の位、[0-9]が0から9で一の位
桁の揃っている01なら可能だが1-12月はfindstrの貧弱な正規表現では1度に表すのは無理なので
1桁の場合と2桁の場合とを別けて検索文字列に設定する必要がある
ちょ、誰か
findstr /r "検索文字列" とfindstr /r /c:"検索文字列" の違いを教えてくれ。忘れた
226: 2017/10/17(火)10:39 ID:AWu3veoe(1) AAS
>>225
解説ありがとうございます
とりあえず日付の所いろいろやってみてるのですがうまく行かないままです。
正規表現といわず直接文字列を指定して | が有効になるかどうかというところから実験してます。
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%"
findstrについての解説は検索で出てきた
外部リンク[html]:www.atmarkit.co.jp
を読みました。読んだだけです。頑張ります
227: 2017/10/17(火)11:38 ID:fpIKg5e5(2/2) AAS
>""10月15日"|"10月16日""
"で""を囲えないしfindstrの正規表現で|は使えない
findstr /?
まともな正規表現を使いたければvbsやPowerShell、Perlとか別のスクリプトに行ったほうがいい
バッチだと"&"や"%"とかダメ文字があるし凝った事をやろうとするといずれ行き詰まる
急がば回れ
228: 2017/10/17(火)22:45 ID:bWF1v8hX(2/2) AAS
参考に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 || "対象フォルダなし");
229: 2017/10/17(火)23:49 ID:G9wCIPXR(1) AAS
もうPowerShellのRename-Item使おうぜ
個人用途だろうし制約ないでしょ
230(1): 2017/10/18(水)02:49 ID:nuzaMfIv(1) AAS
覚えたてによく居るよね
要件無視した勝手な仕様でエラー判定とか結果ダイアログとかゴテゴテ実装してドヤ顔で持ってきちゃう子
231(1): 2017/10/18(水)02:57 ID:O0s7d+Fx(1) AAS
まあダブルクリックで不意に実行されちゃうようなのは作りたくないよな
232: 2017/10/18(水)07:04 ID:G1+K6kx+(1) AAS
>>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%!"
233(1): 2017/10/18(水)22:17 ID:on6I0HDV(1) AAS
>>231
うちの現場のバッチは例え内部で使わなかろうが最低1つは必ず引数を渡す仕様になってる。
そしてそれが渡されなかった場合は処理せずに終了する作りになっている。
理由は誤ってダブクリしちゃった場合の対策なんだってさ。
234: 2017/10/18(水)22:23 ID:hY2xT5yc(1) AAS
batって大体はD&Dして使うようなの書いてるな
235: 2017/10/19(木)01:03 ID:cgLUQcTs(1) AAS
>>230
なんか癇に障ったみたいだけど、言い訳すると
俺は、質問者によって回答内容を変えてる
今回の質問者は初心者だと感じたし、さらには細かい拘りを持っているように見受けられた
(13月32日なんて作らないだろうし、もしあったって1332に変換されて悪いことはないと思う)
色々と手を加えて試行錯誤することが好きなんだろうなって思ったから
役に立ちそうな追加部分を記述した
それに1レスで書く分には、数行増えようが関係ないだろうと思ったしね
236: 2017/10/19(木)08:32 ID:ny4cf+Vz(1) AAS
>>233
なるほど
237: 2017/10/19(木)22:12 ID:JROgBEvY(1) AAS
ザ・ワールド、時よ止まれ。
238(1): 2017/10/20(金)03:00 ID:1Na2h1P4(1/2) AAS
キッティングの自動化をしたいんだが、参考になるサイトない?
239: 2017/10/20(金)03:00 ID:1Na2h1P4(2/2) AAS
対象のレジストリ見つけるとかめんどい
240: 2017/10/20(金)23:41 ID:aZN6SiIl(1) AAS
どの程度の自動化?
241: 2017/10/21(土)08:56 ID:Nsvn2WYb(1) AAS
>>238
何を自動化するん?
242: 2017/10/21(土)16:42 ID:DofUW9OG(1) AAS
そんなんツールが出てるんだからその説明でも読めよ
243: 2017/10/21(土)18:43 ID:TBS9tbdH(1) AAS
一発で、ファイアウォールの受信規則とかインターネットオプションとか
244(1): 名無しさん@そうだ選挙に行こう! Go to vote! 2017/10/22(日)07:51 ID:eb/3UN8i(1) AAS
>>215
$before = ls -Directory | Where-Object { $_ -match "^\d+月\d+日" }
$after = $before | foreach { $_.Name -replace '^(\d+)月(\d+)日', '$1$2' }
$idx = 0;
$before | foreach {
Rename-Item -WhatIf $_.FullName $after[$idx];
$idx++;
}
PowerShell で書いたので、cd で、そのフォルダへ移動して実行して。
-WhatIf が付いているので、本当には実行せずに、結果だけを見れる。
本当に実行する際は、-WhatIf を削除して実行して
配列 $before には「02月03日」などで始まるフォルダだけを、入れる。
配列 $after には「02月03日」の部分だけを「0203」に変換した、フォルダ名を入れる
Rename-Item で、該当する全フォルダ名を変換する
245: 名無しさん@そうだ選挙に行こう! Go to vote! 2017/10/22(日)14:53 ID:1YRZU7Jo(1) AAS
問題は、月を01〜12まで、日を01〜31までのチェックを入れることだけどね
246: 名無しさん@そうだ選挙に行こう! Go to vote! 2017/10/22(日)16:29 ID:rLFHcAK9(1) AAS
>>244
ls <directory-name> -directory | ren -newname {$_.name -replace '^(¥d+)月(¥d+)日', '$1$2' }
lsの-filterやwhere-object使ってもいいけど
この例の場合は不要だと思うよ
247(1): 2017/10/23(月)07:20 ID:A3jhOkfm(1) AAS
ls -directory | ren -WhatIf -newname {$_.name -replace '^(\d+)月(\d+)日', '$1$2' }
上記で、where-object が無いと、
変更されないフォルダまで、表示されるのが気持ち悪い
248: 2017/10/23(月)22:30 ID:TV21zs/8(1) AAS
Windows7SP1では、Get-ChildItemに-directoryオプションは無いんでエラーが表示された
調べたら、3.0以降でこのオプションが付いた模様
この際なので、5.0,5.1をインストールした
Windows7の人の参考まで
249: 2017/10/24(火)18:41 ID:QQrV41zo(1) AAS
PowerShellのスクリプトファイルの拡張子は普通.ps1を使うが
デフォルトではファイルの実行を許可してないし、
また許可後もダイレクトにファイル名を指定しても実行できない
って保険かけすぎで入門者には敷居が高いだろと思わないでもないなあ
>>247
where-objectを入れてみた
(まだ2時間ぐらいしかやってないんでもっといい書き方があるかも)
$re='^(\d+)月(\d+)日';ls -directory|? name -match $re|ren -whatif -newname {$_.name -replace $re,'$1$2'}
このスレ的にはアリアス使うなら、lsよりもdirが合ってる気もするけど
250(3): 2017/11/03(金)20:22 ID:+gpl8JNW(1) AAS
ここで聞くべきか迷ったのですが…
自分のマシンからリモートデスクトップで接続できるサーバー(確かWin2008R2)があって
そのサーバーと同じネットワーク内にクライアント端末(Win7)があります。
そのクライアント端末のプロセスをリモートデスクトップで接続したサーバーから確認することは可能でしょうか?
(サーバーには管理者権限で接続しています)
要はクライアント端末でtasklistコマンドを打った結果が見たいのですが。
ちなみにクライアント端末はDHCP設定なので起動のたびにIPアドレスが変わります…
今は1日に何度も遠くにあるクライアント端末まで行ってプロセスを確認しています。
1回だけ行ってIPアドレスをメモるぐらいなら全然構わないので何か方法があれば教えて下さい。
上下前次1-新書関写板覧索設栞歴
あと 752 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.012s