it技術:バッチファイル
                差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| it技術:バッチファイル [2017/04/19 11:46] – [日付加算はvbsにやらせる] yajuadmin | it技術:バッチファイル [2021/04/09 10:23] (現在) – [UNCパスの対応方法] yajuadmin | ||
|---|---|---|---|
| 行 5: | 行 5: | ||
| cd /d %~dp0 | cd /d %~dp0 | ||
| </ | </ | ||
| + | “%~dp0” は、“%0” で 0 番目の引数 (つまりバッチファイルのフルパス) から、“~” (チルダ) で両端を囲むダブルクオートを取り除き、“d” でドライブレターを残し、更に “p” でパスを残す、つまり、バッチファイルのあるフォルダまでのパスを示しています。 | ||
| + | ===== 32bit環境で実行 ===== | ||
| + | 64bitOS上では、コマンドプロンプトやCScriptは64bitで動作してしまうため、WOW64内環境内で実行させる必要がある。\\ | ||
| + | [[http:// | ||
| + | |||
| + | Excelファイルのデータアクセスに「OLEDB4.0」を使う場合、32bit環境でないとエラーとなる。\\ | ||
| + | IISで32bitモードで動作する際に使用するモジュールのレジストリ登録も32bit環境で実行させる。 | ||
| + | ==== VBSの場合 ==== | ||
| + | <code bat> | ||
| + | %windir%SysWOW64\cscript.exe xxxxx.vbs | ||
| + | または | ||
| + | %windir%SysWOW64\cmd.exe xxxxx.vbs | ||
| + | </ | ||
| + | ==== レジストリ登録の場合 ==== | ||
| + | 「ファイル名を指定して実行」で入力する | ||
| + | <code bat> | ||
| + | %windir%SysWOW64\regsvr32 xxxxx.dll | ||
| + | </ | ||
| ===== 変数の値が反映されない ===== | ===== 変数の値が反映されない ===== | ||
| if文、for文の中に書いた処理は「()を抜けてから」変数の値が反映される。\\ | if文、for文の中に書いた処理は「()を抜けてから」変数の値が反映される。\\ | ||
| 行 39: | 行 57: | ||
| echo ファイルが見つかりません ^(%filePath%^) | echo ファイルが見つかりません ^(%filePath%^) | ||
| ) | ) | ||
| + | </ | ||
| + | |||
| + | ===== 日時(YYYYMMDDHHMMSS)形式のセット ===== | ||
| + | 現在時刻をYYYYMMDDHHMMSS形式で取得する。 | ||
| + | |||
| + | < | ||
| + | set time_tmp=%time: | ||
| + | set now=%date:/ | ||
| + | echo %now% | ||
| </ | </ | ||
| 行 68: | 行 95: | ||
| </ | </ | ||
| + | ===== 2重引用符を削除 ===== | ||
| + | %n変数に〜チルダ文字を追加する。 | ||
| + | |||
| + | <code bat> | ||
| + | set befPath=%~1 | ||
| + | </ | ||
| ===== ログとリダイレクト ===== | ===== ログとリダイレクト ===== | ||
| - | 参照:[[http:// | + | [[http:// | 
| 「> | 「> | ||
| 行 76: | 行 109: | ||
| 通常のリダイレクトは標準出力(「1」)に書き込まれるが、エラーメッセージはエラー出力(「2」)に書き込まれるためエラーメッセージをログに記録しておくことができない。その場合、「2>& | 通常のリダイレクトは標準出力(「1」)に書き込まれるが、エラーメッセージはエラー出力(「2」)に書き込まれるためエラーメッセージをログに記録しておくことができない。その場合、「2>& | ||
| <code bat> | <code bat> | ||
| + | echp 開始 %date% %time% > log.txt  | ||
| call sub.bat >> log.txt | call sub.bat >> log.txt | ||
| ↓ | ↓ | ||
| call sub.bat >> log.txt 2>&1 | call sub.bat >> log.txt 2>&1 | ||
| </ | </ | ||
| + | |||
| ===== 空白含む内容のパラメータ渡し ===== | ===== 空白含む内容のパラメータ渡し ===== | ||
| 行 112: | 行 147: | ||
| echo %res% | echo %res% | ||
| </ | </ | ||
| - | 参照:[[http:// | + | [[http:// | 
| ===== 一定期間経過した古いファイルを自動削除する ===== | ===== 一定期間経過した古いファイルを自動削除する ===== | ||
| 行 127: | 行 162: | ||
| exit 0 | exit 0 | ||
| </ | </ | ||
| - | 参照:[[http:// | + | [[http:// | 
| |Windowsで一定期間経過した古いファイルを自動削除するコマンドは?コマンドプロンプト標準コマンドがある]] | |Windowsで一定期間経過した古いファイルを自動削除するコマンドは?コマンドプロンプト標準コマンドがある]] | ||
| + | ==== UNCパスの対応方法 ==== | ||
| + | forfilesでUNCパスを指定すると「unc パス ( コンピューター名 共有名) はサポートされていません。」のエラーになる。 | ||
| + | |||
| + | forfilesでUNCパスが非対応なので、前行で pushd UNCパス とする。 | ||
| + | |||
| + | < | ||
| + | SET NET_DIR=\\192.168.64.100\work\ | ||
| + | |||
| + | net use %NET_DIR% xxxxxxx / | ||
| + | |||
| + | pushd %NET_DIR% | ||
| + | forfiles /M *.txt /C "cmd /c if @isdir==FALSE del /s @path" /D -30 >> logdel.log | ||
| + | popd | ||
| + | </ | ||
| ===== 常に管理者権限で実行する ===== | ===== 常に管理者権限で実行する ===== | ||
| ショートカットを管理者で実行するように設定\\ | ショートカットを管理者で実行するように設定\\ | ||
| 行 138: | 行 187: | ||
|   * [[http:// |   * [[http:// | ||
| + | ===== 管理者権限か判定する ===== | ||
| + | 管理者権限か判定して警告メッセージを出す。 | ||
| + | [[https:// | ||
| + | |||
| + | <code bat> | ||
| + | @echo off | ||
| + | openfiles > NUL 2>& | ||
| + | if %ERRORLEVEL% EQU 0 goto Admin | ||
| + | echo 管理者権限で実行してください。 | ||
| + | pause | ||
| + | exit | ||
| + | |||
| + | : | ||
| + | echo 管理者権限で実行中 | ||
| + | </ | ||
| + | ===== レジストリのコマンド編集 ===== | ||
| + | regeditはコマンドラインから実行した場合、成否をerrorlevel環境変数に設定しないため、バッチファイルから使用する場合はregコマンドを使うことが望ましい。\\ | ||
| + | [[http:// | ||
| + | |||
| + | <code bat 書式> | ||
| + | reg サブコマンド キー名 ファイル名 | ||
| + | </ | ||
| + | |||
| + | ^主なサブコマンド^^ | ||
| + | ^query|レジストリのキーや値を画面に表示します。| | ||
| + | ^import|ファイル(*.reg 形式)からレジストリの情報をインポートします。| | ||
| + | ^export|レジストリの情報をファイル(*.reg 形式)に出力します。| | ||
| + | |||
| + | <code bat エクスポート> | ||
| + | Set InstallReg=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\TrendMicro | ||
| + | call :regSub Database_Backup.reg " | ||
| + | |||
| + | :regSub | ||
| + | echo %1 >> regexport.log | ||
| + | reg export " | ||
| + | exit /b | ||
| + | </ | ||
| + | |||
| + | <code bat インポート> | ||
| + | call :regSub Database_Backup.reg | ||
| + | |||
| + | :regSub | ||
| + | if exist %1 ( | ||
| + | echo %1 >> regimport.log | ||
| + | reg import %1 >> regimport.log 2>&1 | ||
| + | ) | ||
| + | exit /b | ||
| + | </ | ||
| + | |||
| + | ===== ファイルコピー ===== | ||
| + | ==== XCopy ==== | ||
| + | ディレクトリツリーごとコピーできるところが、copy との最大の違いとなります。\\ | ||
| + | [[https:// | ||
| + | |||
| + | ^よく使用するオプション^^ | ||
| + | ^/ | ||
| + | ^/ | ||
| + | ^/ | ||
| + | ^/ | ||
| + | ^/ | ||
| + | |||
| + | XCOPY元としてフォルダを指定する場合,フォルダ名の末尾に\を付けないこと\\ | ||
| + | XCOPY先としてフォルダを指定する場合,フォルダ名の末尾に\を付けること | ||
| + | |||
| + | === 「ファイル名ですか、またはディレクトリ名ですか」の確認 === | ||
| + | [[http:// | ||
| + | 「複写先が既存のディレクトリを含まず、かつ、名前が円記号(\)で終わっていない場合」または「複写元の下位フォルダに同じファイルがある場合」に表示される。 | ||
| + | |||
| + | 回避策としては複写先に円記号(\)を付ける。または下記のように強制的にファイルにecho F(ファイル) or D(ディレクトリ)を指定する。\\ | ||
| + | ※複写元の下位フォルダに同じファイルがある場合、最後に見つかったファイルがコピーされる。\\ | ||
| + | その場合、XCopyをやめてCopy(複写先にフォルダの作成が必要)にするか、更新日が新しいのが確実なら「/ | ||
| + | <code bat> | ||
| + | Set InstallDir=D: | ||
| + | echo F|XCopy " | ||
| + | </ | ||
| + | |||
| + | === デメリット === | ||
| + | [[http:// | ||
| + | |||
| + | * XCOPYは、長い(255文字を越える)ファイル名を処理できず、異常終了します。 | ||
| + | * XCOPY /d で「タイムスタンプが新しくなったファイルだけをコピー」するとき、 コピー先のファイルのタイムスタンプが、コピー元のファイルのタイムスタンプと、秒単位でずれることがあります。 そのため、XCOPY処理を日次で実行して、本来は毎日差分だけをコピーするつもりでいても、 毎日全ファイルをコピーしてしまうことがあります。 | ||
| + | |||
| + | ==== Robocopy ==== | ||
| + | Windows Vista 以降、Windows Server 2008 以降では標準コマンドとして用意されている。\\ | ||
| + | [[http:// | ||
| + | |||
| + | メリット | ||
| + | * 255文字以上のファイルパスに対応 | ||
| + | * ミラーリング(差分コピーと同じです) | ||
| + | * コピー先のいらないファイルを削除するのみ | ||
| + | * 古いファイルはコピーしない | ||
| + | * コピーではなく移動する | ||
| + | * リトライがある | ||
| + | * フォルダ体系のみコピーし、アクセス権をコピーしたい | ||
| + | * アクセス権が無いけどバックアップに使いたい | ||
| + | * タイムスタンプを維持できる | ||
| + | |||
| + | などなど | ||
| + | |||
| + | ==== FastCopy ==== | ||
| + | Windows系最速(? | ||
| + | [[http:// | ||
| + | |||
| + | UNICODE でしか表現できないファイル名やMAX_PATH(260文字) を越えた位置のファイルもコピー(&削除)できます。\\ | ||
| + | Read/Write も、OS のキャッシュを全く使わないため、他のプロセス(アプリケーション)が重くなりにくくなっています。可能な限り大きな単位で Read/Write するため、デバイスの限界に近いパフォーマンスが出ます。 | ||
| + | |||
| + | GUI版だけでなくコマンドライン版があります。 | ||
| + | <code bat 書式> | ||
| + | fastcopy.exe [/ | ||
| + | </ | ||
| + | |||
| + | ===== フォルダ自体をコピーする ===== | ||
| + | フォルダ自体をコピーするには、コピー先にフォルダを指定する。 | ||
| + | < | ||
| + | robocopy C:\AAA\hoge D:\BBB\hoge /E | ||
| + | echo d | xcopy C:\AAA\hoge D:\BBB\hoge /E | ||
| + | </ | ||
| + | |||
| + | ==== フォルダの更新日時を維持してコピーする ==== | ||
| + | フォルダの更新日時を維持してコピーするには、robocopyのオプション「/ | ||
| + | < | ||
| + | robocopy C:\AAA\hoge D:\BBB\hoge /E / | ||
| + | </ | ||
| ===== 参照 ===== | ===== 参照 ===== | ||
|   * [[http:// |   * [[http:// | ||
|   * [[http:// |   * [[http:// | ||
|   * [[https:// |   * [[https:// | ||
it技術/バッチファイル.1492569993.txt.gz · 最終更新: 2017/04/19 11:46 by yajuadmin
                
                