#author("2022-03-03T05:09:08+00:00","default:admin","admin") #author("2022-03-03T06:02:19+00:00","default:admin","admin") -[[知識ゼロからのwindowsバッチファイル超入門:https://jj-blues.com/cms/]] -[[コマンドプロンプトを使ってみよう:http://ykr414.com/dos/index.html]] -[[バッチファイルを使用する:http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/ServerHelp/89fdf70e-7d52-4f45-865d-6a61963a3a7e.mspx?mfr=true]] -[[開発に役立つ,BATファイルの書き方・パターン集 (コマンドプロンプトの定石を体系的に学び,バッチ中級者になろう):https://language-and-engineering.hatenablog.jp/entry/20130502/PatternsOfMSDOSorBAT#VariablesAndCalculation]] -[[【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ:https://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a]] -[[Windows Serverで動作する、バックアップ+世代管理してくれるバッチファイル:https://ameblo.jp/welx/entry-11060432960.html]] -[[Windows PowerShellを使ってデータファイルを圧縮するバッチを作成してみた:https://www.casleyconsulting.co.jp/blog/engineer/233/]] -[[簡易バックアップの世代管理:https://plaza.rakuten.co.jp/tebukko/diary/201209030000/]] -[[【bat】経過日数およびファイル数で古いファイルを削除する方法:https://mitosuya.net/delete-old-file]] *引数 [#xfcd4acd] -[[バッチファイルでよく使う書き方まとめ:https://qiita.com/sta/items/8cab80fe74b8dcfa5336]] *パラメーターの修飾子 [#hc7bb46d] | 修飾子 | 機能・用途 |h | %~1 | 全ての引用句(")を削除して%1を展開する。| | %~f1 | %1を完全修飾パス名に展開する。| | %~d1 | %1をドライブ名だけに展開する。| | %~p1 | %1をパスだけに展開する。| | %~n1 | %1をファイル名だけに展開する。| | %~x1 | %1をファイル拡張子だけに展開する。| | %~s1 | 展開されたパスはMS-DOSの「8.3形式」でも短い名前だけを含む。| | %~a1 | %1をファイル属性に展開する。| | %~t1 | %1をファイルの日付・時刻に展開する。| | %~z1 | %1をファイルのサイズに展開する。| | %~$PATH:1 | PATH環境に指定されているディレクトリを検索し、最初に見つかった完全修飾名 に%1を展開する。環境変数名が定義されていない場合、また検索してもファイルが見つからなかった 場合は、この修飾子を指定すると空の文字列に展開する。| *変数 [#tc80f1d6] -[[コマンドの実行結果を変数にセットする:https://commandprompt.noyokan.com/command/execution_result.html]] -[[バッチ処理のパイプ「| の使い方が誤っています。」エラーの原因と対処について:https://rainbow-engine.com/batch-pipe-usageerror/]] **set [#dfaa59f4] -[[set(変数の設定・計算・ユーザーからの入力情報の取得):https://jj-blues.com/cms/command-set/]] -値をセット set [変数名]=[代入したい文字列] -計算を行うときは、「/a」オプションを指定 set /a [変数]=[計算式] --計算式で使える演算子は + - * / %%(剰余) *バッチファイル内で使えるコマンド [#i8801e6a] | コマンド | 機能 |h | echo | バッチファイルの中のメッセージの表示、非表示 | | rem | 注釈行を設定する。 | | pause | バッチファイルの処理を一時停止させる。 | | if else | 条件によって処理を分岐する。 | | goto | バッチファイルの中の別の処理ブロックにジャンプする。 | | call | 現在のバッチファイルから他のバッチファイルを呼び出し移動させる。 | | for | コマンドを繰り返して実行させる。 | | shift | バッチパラメータを繰り上げる。 | | setlocal | バッチファイルでの環境変数の使用を開始する。 | | endlocal | バッチファイルでの環境変数の使用を終了する。 | *サブルーチン [#vc2062fa] **errorlevel [#d28acff2] -[[errorlevel(終了コードを取得する):https://jj-blues.com/cms/command-errorlevel/]] **setlocal/endlocal [#uf4d079d] -[[setlocalとendlocal(ローカル変数を使う):https://jj-blues.com/cms/command-setlocalendlocal/]] *遅延環境変数 [#c1a27b2b] -[[バッチファイル界の魔境『遅延環境変数』に挑む(おまけもあるよ):https://qiita.com/sawa_tsuka/items/c7c477cacf8c97792e17]] *Tips [#ld93ca8b] **スリープ [#a43a0d74] -[[Windowsのバッチファイルで「〇秒休止(sleep)」するには?【 2020年最新版 】:https://linuxfan.info/windows-cmd-sleep]] -[[バッチファイルで指定日時まで待つ:https://qiita.com/tootwotoh/items/94e8e49cd73e69e9c971]] **終了 [#u34f4424] -[[Windows、バッチファイル(.bat)を終了するときは「exit」ではなく「exit /B」を使おう:http://piyopiyocs.blog115.fc2.com/blog-entry-884.html]] -[[【バッチ】時刻を比較して処理を終了させる:https://qiita.com/tsuttie/items/619fef8543e192df72c7]] **文字列0埋めフォーマット [#w7c121c9] -[[Windowsバッチで0埋めフォーマットする:https://bbh.bz/2019/09/12/windows-bat-format-0padding/]] **改行 [#x6570cd2] -[[echoで改行する:https://jj-blues.com/cms/wantto-echonewline/]] echo; **日付・時間 [#nced1683] -[[バッチファイルで日付(yyyymmdd)、時間(hhmiss)を取得する:https://kuroeveryday.blogspot.com/2014/02/GetDateTime.html]] --年 %DATE:~-10,4% --月 %DATE:~-5,2% --日 %DATE:~-2% --時 %TIME:~0,2% --分 %TIME:~3,2% --秒 %TIME:~6,2% -1週間前の日付の文字列を取得 --[[バッチとPowerShellで昨日の日付を取得する:https://www.greptips.com/posts/801/]] FOR /F "usebackq delims=" %%a in (`powershell "(get-date).AddDays(-7).ToString(\"yyyy-MM-dd\")"`) do Set TARGET_DATE=%%a **曜日 [#sa81dd9d] -[[BATスクリプト 曜日の取得:http://yanor.net/wiki/?Windows/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%20-%20%E3%83%90%E3%83%83%E3%83%81/%E6%9B%9C%E6%97%A5%E3%81%AE%E5%8F%96%E5%BE%97]] **ファイル検索 [#g3e883bb] -[[windosの指定日付より前のファイルを削除する:https://qiita.com/gitya107/items/a11deb3d83d8d624175c]] **ファイル処理 [#s05059ca] -[[Windowsのforfilesコマンドで条件に合うファイルを取り出して処理する:https://www.atmarkit.co.jp/ait/articles/0902/27/news132.html]] ***forfiles [#hc3fc8c5] C:\>forfiles /? FORFILES [/P パス名] [/M 検索マスク] [/S] [/C コマンド] [/D [+ | -] {yyyy/MM/dd | dd}] 説明: ファイル (または、ファイルのセット) を選んで、そのファイル上の コマンドを実行します。これはバッチ ジョブの使用に便利です。 パラメーター一覧: /P パス名 検索を開始するパスを示します。 既定のフォルダーは現在実行中の ディレクトリ (.) です。 /M 検索マスク 検索マスクによってファイルを検索します。 既定の検索マスクは '*' です。 /S サブディレクトリに対しても処理を行うように forfiles に 指示します (例: "DIR /S")。 /C コマンド 各ファイルの実行するコマンドを示します。 コマンドの文字列は二重引用符で囲んでくだ さい。 既定のコマンドは "cmd /c echo @file" です。 次の変数をコマンドの文字列に使用することができ ます: @file - フィルの名前を返します。 @fname - 拡張子なしのファイル名を 返します。 @ext - ファイルの拡張子だけを返し ます。 @path - ファイルの完全なパスを返します。 @relpath - ファイルの相対パスを返し ます。 @isdir - ファイルの種類がディレクトリの場合 は "TRUE"を、ファイルの場合は "FALSE" を返します。 @fsize - ファイルのサイズをバイトで返し ます。 @fdate - ファイルの最終更新日を返し ます。 @ftime - ファイルの最終更新時刻を返し ます。 コマンド ラインに特殊文字を使用する場合は、 文字を 16 進数コードで 0xHH 形式で (例: タブは 0x09) 指定してください。CMD.EXE の 内部コマンドの前には "cmd /c" が必要 です。 /D 日付 最終更新日が指定された日かもしくはそれ 以降 (+)、または指定された日またはそれ 以前 (-) であるファイルを "yyyy/MM/dd" 形式を使っ て選択します。または、最終更新日が現在 の日にちより "dd" 日あと、もしくは "dd" 日 前であるファイルを選択します。有効な "dd" 値は 0 から 32768 の間です。 指定がない場合は、"+" が既定で使用さ れます。 /? ヘルプまたは使用法を表示します。 例: FORFILES /? FORFILES FORFILES /P C:\WINDOWS /S /M DNS*.* FORFILES /S /M *.txt /C "cmd /c type @file | more" FORFILES /P C:\ /S /M *.bat FORFILES /D -30 /M *.exe /C "cmd /c echo @path 0x09 was changed 30 days ago" FORFILES /D 2001/01/01 /C "cmd /c echo @fname is new since Jan 1st 2001" FORFILES /D +2019/7/23 /C "cmd /c echo @fname is new today" FORFILES /M *.exe /D +1 FORFILES /S /M *.doc /C "cmd /c echo @fsize" FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file" ***サンプル)過去ファイル削除 [#u409884c] rem ************************************************ @echo 引数1:対象フォルダ @echo 引数2:ファイルパターン @echo 引数3:経過日数 rem ************************************************ @echo off set PARAM_ALL_SET=TRUE if "%~1" == "" set PARAM_ALL_SET=FALSE if "%~2" == "" set PARAM_ALL_SET=FALSE if "%~3" == "" set PARAM_ALL_SET=FALSE if %PARAM_ALL_SET%==FALSE ( @echo usage: delete_old_files 対象フォルダ ファイルパターン 経過日数 exit /B ) if not exist "%1\" ( @echo 存在しないフォルダが指定されました exit /B ) @echo 引数1のフォルダ内の、引数2のパターンに合致するファイルの、引数3で指定した日数が経過したファイルを削除します forfiles /p %1 /m %2 /d -%3 /c "cmd /c del @file" **イベントログ [#j5ba111f] -[[Windowsイベントログをテキスト形式でエクスポートする方法:https://4thsight.xyz/10364]] -[[【Windows】イベントログをコマンドで保存する[Get-EventLog]:https://bizlog.tech/eventlog-export/]] ***[[wevtutil:https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/wevtutil]] [#ca920981] -[[wevtutil でイベントログをフィルタリングするサンプル:https://stakiran.hatenablog.com/entry/2018/04/25/193335]] *作成事例 [#u64ab302] **指定時刻になったらイベントログを出力 [#m9fe416c] @echo off rem イベントログを出力したい時刻を指定 set HH=03 set MM=00 set SS=00 rem 複数のコマンドをパイプで繋ぐ場合は,^ を | の前に書く(エスケープシーケンス) rem カッコ内にある "`" はバッククォートというもので,シフトを押しながら@キーを押して入力します for /f "usebackq" %%t in (`dir /A-D /B eventlog_system* ^| find /c /v ""`) do set count_evlog_system=%%t set /a count_evlog_system=%count_evlog_system%+1 rem ファイル連番(0埋め) set formated_seq=000%count_evlog_system% rem 右から3文字を抜き出す set formated_seq=%formated_seq:~-3% for /f "usebackq delims=," %%a in (`powershell "(get-date -hour " %HH% " -minute " %MM% " -second " %SS% ").tostring('yyyy/M/d H:m:s')"`) do set tm=%%a echo %tm% になったらイベントログを出力 echo. echo %date% %time% rem tmまで待つ powershell "$w = [DateTime]'%tm%' ; if ((get-date) -lt $w) { $w = new-timespan -start (get-date) -end $w ; Start-Sleep -seconds $w.totalseconds ; $ws = New-Object -com Wscript.Shell}" echo %date% %time% rem イベントログ/System をテキストで出力 rem wevtutil qe System /f:text /rd:true > eventlog_system-%formated_seq%.txt rem イベントログ/Application をテキストで出力 rem wevtutil qe Application /f:text /rd:true > eventlog_application-%formated_seq%.txt rem イベントログ/System をエクスポート(イベントログ形式) wevtutil epl System eventlog_system-%formated_seq%.evtx rem イベントログ/Application をエクスポート(イベントログ形式) wevtutil epl Application eventlog_application-%formated_seq%.evtx goto :eof