cd /d %~dp0
“%~dp0” は、“%0” で 0 番目の引数 (つまりバッチファイルのフルパス) から、“~” (チルダ) で両端を囲むダブルクオートを取り除き、“d” でドライブレターを残し、更に “p” でパスを残す、つまり、バッチファイルのあるフォルダまでのパスを示しています。
64bitOS上では、コマンドプロンプトやCScriptは64bitで動作してしまうため、WOW64内環境内で実行させる必要がある。
Win32アプリケーションを実行するWOW64
Excelファイルのデータアクセスに「OLEDB4.0」を使う場合、32bit環境でないとエラーとなる。
IISで32bitモードで動作する際に使用するモジュールのレジストリ登録も32bit環境で実行させる。
%windir%SysWOW64\cscript.exe xxxxx.vbs または %windir%SysWOW64\cmd.exe xxxxx.vbs
「ファイル名を指定して実行」で入力する
%windir%SysWOW64\regsvr32 xxxxx.dll
if文、for文の中に書いた処理は「()を抜けてから」変数の値が反映される。
if文、for文内で反映するには、遅延環境変数を使用する。
バッチファイルのif文やfor文で気をつけること
(の直前にスペースが無いとこのエラーになる。
IF "%ERRORLEVEL%" == "0" (
If文の中に()があるとエラーになる。
if not exist %filePath% ( echo ファイルが見つかりません (%filePath%) )
対応として、()を^でエスケープする。
if not exist %filePath% ( echo ファイルが見つかりません ^(%filePath%^) )
現在時刻をYYYYMMDDHHMMSS形式で取得する。
set time_tmp=%time: =0% set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2% echo %now%
バッチ処理では困ったことに日付の計算が簡単には出来ません。その部分は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\
%n変数に〜チルダ文字を追加する。
set befPath=%~1
「>」(リダイレクト記号)を使えば,ログをファイルに保存できる。
「> >」としてリダイレクト記号を2重にするとログファイルの追記モードとなる。
通常のリダイレクトは標準出力(「1」)に書き込まれるが、エラーメッセージはエラー出力(「2」)に書き込まれるためエラーメッセージをログに記録しておくことができない。その場合、「2>&1」として「2の代案を1にする」操作を追記させる。
echp 開始 %date% %time% > log.txt 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
上位フォルダが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側で「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日とする。
@ECHO OFF cd /d %~dp0 REM 最終更新日が61日以上前のファイルを削除します。 forfiles /p "sqllog" /S /d -61 /c "cmd /c del /F /Q @path" exit 0
forfilesでUNCパスを指定すると「unc パス ( コンピューター名 共有名) はサポートされていません。」のエラーになる。
forfilesでUNCパスが非対応なので、前行で pushd UNCパス とする。
SET NET_DIR=\\192.168.64.100\work\ net use %NET_DIR% xxxxxxx /USER:xxxxxxx pushd %NET_DIR% forfiles /M *.txt /C "cmd /c if @isdir==FALSE del /s @path" /D -30 >> logdel.log popd
ショートカットを管理者で実行するように設定
①バッチファイルのショートカットを作成し、ショートカットのプロパティ「ショートカット」タブの「詳細設定」ボタンをクリックします。
②詳細プロパティの「管理者として実行」にチェックを付けます。
管理者権限か判定して警告メッセージを出す。
@echo off openfiles > NUL 2>&1 if %ERRORLEVEL% EQU 0 goto Admin echo 管理者権限で実行してください。 pause exit :Admin echo 管理者権限で実行中
regeditはコマンドラインから実行した場合、成否をerrorlevel環境変数に設定しないため、バッチファイルから使用する場合はregコマンドを使うことが望ましい。
コマンドプロンプトでレジストリを操作する
reg サブコマンド キー名 ファイル名
主なサブコマンド | |
---|---|
query | レジストリのキーや値を画面に表示します。 |
import | ファイル(*.reg 形式)からレジストリの情報をインポートします。 |
export | レジストリの情報をファイル(*.reg 形式)に出力します。 |
Set InstallReg=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\TrendMicro call :regSub Database_Backup.reg "Database Backup" :regSub echo %1 >> regexport.log reg export "%InstallReg%\%~2" %1 >> regexport.log 2>&1 exit /b
call :regSub Database_Backup.reg :regSub if exist %1 ( echo %1 >> regimport.log reg import %1 >> regimport.log 2>&1 ) exit /b
ディレクトリツリーごとコピーできるところが、copy との最大の違いとなります。
xcopyのオプション
よく使用するオプション | |
---|---|
/S | ファイルが存在する場合のみディレクトリごとコピーする |
/E | ファイルが存在しなくてもディレクトリごとコピーする |
/I | コピー先のディレクトリが存在しない場合は新規にディレクトリを作成する |
/Y | 同名のファイルが存在する場合、上書きの確認を行わない |
/D | コピー先に同名のファイルが存在する場合に更新日が新しいファイルのみコピーする |
XCOPY元としてフォルダを指定する場合,フォルダ名の末尾に\を付けないこと
XCOPY先としてフォルダを指定する場合,フォルダ名の末尾に\を付けること
xcopyでフォルダコピー時に「ファイル名ですか、またはディレクトリ名ですか」と聞いてくる
「複写先が既存のディレクトリを含まず、かつ、名前が円記号(\)で終わっていない場合」または「複写元の下位フォルダに同じファイルがある場合」に表示される。
回避策としては複写先に円記号(\)を付ける。または下記のように強制的にファイルにecho F(ファイル) or D(ディレクトリ)を指定する。
※複写元の下位フォルダに同じファイルがある場合、最後に見つかったファイルがコピーされる。
その場合、XCopyをやめてCopy(複写先にフォルダの作成が必要)にするか、更新日が新しいのが確実なら「/D」を付ける。
Set InstallDir=D:\Program Files (x86)\Trend Micro\OfficeScan echo F|XCopy "%InstallDir%\PCCSRV\Admin\ssnotify.ini" PCCSRV\Admin\ /S /Y /I /D
Windows Vista 以降、Windows Server 2008 以降では標準コマンドとして用意されている。
windowsのバックアップやファイルサーバー移行にオススメな標準コマンド「robocopy」の使い方、オプション説明
メリット
などなど
Windows系最速(?)のファイルコピー&削除ツール FastCopy
高速コピーツール「FastCopy」はホントに早かった!
UNICODE でしか表現できないファイル名やMAX_PATH(260文字) を越えた位置のファイルもコピー(&削除)できます。
Read/Write も、OS のキャッシュを全く使わないため、他のプロセス(アプリケーション)が重くなりにくくなっています。可能な限り大きな単位で Read/Write するため、デバイスの限界に近いパフォーマンスが出ます。
GUI版だけでなくコマンドライン版があります。
fastcopy.exe [/オプション類] file1 file2 ... [/to=dest_dir]
フォルダ自体をコピーするには、コピー先にフォルダを指定する。
robocopy C:\AAA\hoge D:\BBB\hoge /E echo d | xcopy C:\AAA\hoge D:\BBB\hoge /E
フォルダの更新日時を維持してコピーするには、robocopyのオプション「/DCOPY:T」を使う。
robocopy C:\AAA\hoge D:\BBB\hoge /E /DCOPY:T