ユーザ用ツール

サイト用ツール


it技術:バッチファイル

文書の過去の版を表示しています。


バッチファイル

カレントフォルダ指定

cd /d %~dp0

変数の値が反映されない

if文、for文の中に書いた処理は「()を抜けてから」変数の値が反映される。
if文、for文内で反映するには、遅延環境変数を使用する。
バッチファイルのif文やfor文で気をつけること

  1. setlocalコマンドにオプション「enabledelayedexpansion」を付ける。
  2. 変数の展開は「%」ではなくて「!」で行なう。

遅延環境変数を理解する

コマンドの構文が誤っています。

(の直前にスペースが無いとこのエラーになる。

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%

BATからVBscriptを呼び出すパターンとサンプル

一定期間経過した古いファイルを自動削除する

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

Windowsで一定期間経過した古いファイルを自動削除するコマンドは?コマンドプロンプト標準コマンドがある

常に管理者権限で実行する

ショートカットを管理者で実行するように設定
①バッチファイルのショートカットを作成し、ショートカットのプロパティ「ショートカット」タブの「詳細設定」ボタンをクリックします。
②詳細プロパティの「管理者として実行」にチェックを付けます。

ファイルコピー

XCopy

ディレクトリツリーごとコピーできるところが、copy との最大の違いとなります。
xcopyのオプション

よく使用するオプション
/Sファイルが存在する場合のみディレクトリごとコピーする
/Eファイルが存在しなくてもディレクトリごとコピーする
/Iコピー先のディレクトリが存在しない場合は新規にディレクトリを作成する
/Y同名のファイルが存在する場合、上書きの確認を行わない

「ファイル名ですか、またはディレクトリ名ですか」の確認

xcopyでフォルダコピー時に「ファイル名ですか、またはディレクトリ名ですか」と聞いてくる
「複写先が既存のディレクトリを含まず、かつ、名前が円記号(\)で終わっていない場合」または「複写元の下位フォルダに同じファイルがある場合」に表示される。

回避策としては複写先に円記号(\)を付ける。または下記のように強制的にファイルにecho F(ファイル) or D(ディレクトリ)を指定する。

Set InstallDir=D:\Program Files (x86)\Trend Micro\OfficeScan
echo F|XCopy /S /Y /I "%InstallDir%\PCCSRV\Admin\ssnotify.ini" PCCSRV\Admin\

デメリット

robocopyコマンドでフォルダの内容を同期させる

  • XCOPYは、長い(255文字を越える)ファイル名を処理できず、異常終了します。
  • XCOPY /d で「タイムスタンプが新しくなったファイルだけをコピー」するとき、 コピー先のファイルのタイムスタンプが、コピー元のファイルのタイムスタンプと、秒単位でずれることがあります。 そのため、XCOPY処理を日次で実行して、本来は毎日差分だけをコピーするつもりでいても、 毎日全ファイルをコピーしてしまうことがあります。

Robocopy

Windows Vista 以降、Windows Server 2008 以降では標準コマンドとして用意されている。
windowsのバックアップやファイルサーバー移行にオススメな標準コマンド「robocopy」の使い方、オプション説明

メリット

  • 255文字以上のファイルパスに対応
  • ミラーリング(差分コピーと同じです)
  • コピー先のいらないファイルを削除するのみ
  • 古いファイルはコピーしない
  • コピーではなく移動する
  • リトライがある
  • フォルダ体系のみコピーし、アクセス権をコピーしたい
  • アクセス権が無いけどバックアップに使いたい
  • タイムスタンプを維持できる

などなど

FastCopy

Windows系最速(?)のファイルコピー&削除ツール FastCopy
高速コピーツール「FastCopy」はホントに早かった!

UNICODE でしか表現できないファイル名やMAX_PATH(260文字) を越えた位置のファイルもコピー(&削除)できます。
Read/Write も、OS のキャッシュを全く使わないため、他のプロセス(アプリケーション)が重くなりにくくなっています。可能な限り大きな単位で Read/Write するため、デバイスの限界に近いパフォーマンスが出ます。

GUI版だけでなくコマンドライン版があります。

fastcopy.exe [/オプション類] file1 file2 ... [/to=dest_dir]

参照

it技術/バッチファイル.1492582529.txt.gz · 最終更新: 2017/04/19 15:15 by yajuadmin