文書の過去の版を表示しています。
目次
バッチファイル
カレントフォルダ指定
cd /d %~dp0
変数の値が反映されない
if文、for文の中に書いた処理は「()を抜けてから」変数の値が反映される。
if文、for文内で反映するには、遅延環境変数を使用する。
バッチファイルのif文やfor文で気をつけること
- setlocalコマンドにオプション「enabledelayedexpansion」を付ける。
- 変数の展開は「%」ではなくて「!」で行なう。
遅延環境変数を理解する
コマンドの構文が誤っています。
(の直前にスペースが無いとこのエラーになる。
IF "%ERRORLEVEL%" == "0" (
xxが誤っています。
If文の中に()があるとエラーになる。
- 悪い例
if not exist %filePath% ( echo ファイルが見つかりません (%filePath%) )
対応として、()を^でエスケープする。
- 良い例
if not exist %filePath% ( echo ファイルが見つかりません ^(%filePath%^) )
日付加算はvbsにやらせる
バッチ処理では困ったことに日付の計算が簡単には出来ません。その部分はVBSに処理をまかせてしまう。
参照:Windows バッチファイルでサイクリック処理
例 短い日付と長い日付で分岐させる。
rem 日付加算 + 1日 set y=%date:~9% echo WScript.Echo DateAdd("d", 1, "%lastDate%") > tmp.vbs for /f "delims=/ tokens=1-3" %%a in ('cscript //nologo tmp.vbs') do ( if defined y ( set addDate=%%a/%%b/%%c ) else ( set addDate=20%%a/%%b/%%c ) ) del tmp.vbs
「%」をエスケープ
「%」を2つ重ねると「%」として表示できる。
例 「Application Files」フォルダを「Application%20Files」フォルダとして半角スペースを「%20」にする。
set publish=Application%%20Files\
ログとリダイレクト
参照:ログとリダイレクト
「>」(リダイレクト記号)を使えば,ログをファイルに保存できる。
「> >」としてリダイレクト記号を2重にするとログファイルの追記モードとなる。
通常のリダイレクトは標準出力(「1」)に書き込まれるが、エラーメッセージはエラー出力(「2」)に書き込まれるためエラーメッセージをログに記録しておくことができない。その場合、「2>&1」として「2の代案を1にする」操作を追記させる。
call sub.bat >> log.txt ↓ call sub.bat >> log.txt 2>&1
空白含む内容のパラメータ渡し
「~ (チルダ)」を%の直後に付けると「“」を除去します。例 「%~2」
Set InstallReg=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\TrendMicro REM レジストリのバックアップ call :regSub Database_Backup.reg "Database Backup" :regSub regedit /E %1 "%InstallReg%\%~2" >> regexport.log 2>&1 exit /b
上位フォルダ関係なくCSVファイルをコピー
上位フォルダがNETBACKUPツールで履歴の日付が付が、上位フォルダ関係なく実績CSVファイルをコピーしたい。
CV-HMI04_20160926121514\CVHMI\JISSEKI\*.csv
CV-HMI04_20160927121515\CVHMI\JISSEKI\*.csv
CV-HMI04_20160928121517\CVHMI\JISSEKI\*.csv
for /R Z:\ %%f in (JISSEKI\*.csv) do xcopy /D /I /Y "%%f" JISSEKI\
VBSから戻り値を取得
VBS側で「WScript.Quit(戻り値)」とした場合、バッチ側は「%ERRORLEVEL%」で取得できる。
戻り値に文字列を返したい場合は、VBS側で「WScript.Echo 戻り値」とした上で下記コードを記述する。
for /f "usebackq tokens=* delims=" %%I in (`call cscript //Nologo (スクリプト名).vbs "%str%" %mode%`) do SET res=%%I echo %res%
一定期間経過した古いファイルを自動削除する
Windows 7,Windows Server 2008以降で使用できるforfilesコマンドを使う、「/S」オプションでサブフォルダも検索対象となる。
レプリケーションのSQLログを保存期間60日とする。
- sqllog削除.bat
@ECHO OFF cd /d %~dp0 REM 最終更新日が61日以上前のファイルを削除します。 forfiles /p "sqllog" /S /d -61 /c "cmd /c del /F /Q @path" exit 0
常に管理者権限で実行する
ショートカットを管理者で実行するように設定
①バッチファイルのショートカットを作成し、ショートカットのプロパティ「ショートカット」タブの「詳細設定」ボタンをクリックします。
②詳細プロパティの「管理者として実行」にチェックを付けます。