2016-10-11 11 views
0

私がチェックしないバッチスクリプトがあります。バッチファイルでループを終了するにはどのように

  1. は、日付と時刻の形式
  2. Oracleリスナーのチェック
  3. オラクルDBのステータスチェック
  4. ディスクスペースとログファイルを作成します:問題の
@echo off 
set ORACLE_SID=equis01 
REM set result_file = %Date:~4,2%.%Date:~7,2%.%Date:~10,4% 

set HH=%TIME: =0% 
set HH=%HH:~0,2% 
set MI=%TIME:~3,2% 
set SS=%TIME:~6,2% 

REM for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set result_file="%%j"."%%i"."%%k"_%HH%.%MI%.%SS%_"DBXXX".log 


if exist %result_file% (
    del %result_file% 
) 

>%result_file% (

echo Oracle Listener Status: 
echo ======================================== 
echo. 
lsnrctl status 

echo. 
echo. 
echo. 
echo Oracle Database Status: 
echo ======================================== 
echo. 
(
echo @monitoring.sql 
) | sqlplus/

) 

echo. 
echo. 
echo. 
echo Disk Space: 
echo ======================================== 
for /f "skip=1 usebackq delims==" %%i in (`wmic logicaldisk where "mediatype='12'" get caption`) do (
call :doit %%i >> "%result_file%" 
) 

goto :eof 


:doit 
set driveletter=%1 
if {%driveletter%}=={} goto :EOF 
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='%driveletter%'" get FreeSpace /format:value`) do set FreeSpace=%%x 
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='%driveletter%'" get Size /format:value`) do set Size=%%x 
set FreeMB=%FreeSpace:~0,-10% 
set SizeMB=%Size:~0,-10% 
set /a Percentage=100 * FreeMB/SizeMB 
echo %driveletter% %FreeMB% GB out of %SizeMB% GB Total - %Percentage%%% free 


rem echo exit 
for %%a in (*.log*) do "C:\Program Files\7-Zip\7z.exe" a -tzip "%result_file%" "%%a" 

説明をご確認ください コードを実行した後、ログファイルをアーカイブする必要があります。 しかし、メッセージは言う:

C: 25 GB out of 42 GB Total - 59% free 
System ERROR: 
The process cannot access the file because it is being used by another process. 
ERROR: 11.10.2016_17.47.31_DBXXX.log 
Can not open the file as archive 
D: 88 GB out of 107 GB Total - 82% free 
System ERROR: 
The process cannot access the file because it is being used by another process. 
ERROR: 11.10.2016_17.47.31_DBXXX.log 
Can not open the file as archive 
E: 415 GB out of 436 GB Total - 95% free 
System ERROR: 
The process cannot access the file because it is being used by another process. 
ERROR: 11.10.2016_17.47.31_DBXXX.log 
Can not open the file as archive 

問題を解決する方法は?あなたはこのようなコードを簡素化することができWMIC部分について

+0

PowerShellには、実際の言語のループ構造がはるかに明確で使いやすいため、cmd.exeシェルスクリプト(バッチファイル)を使用するのではなく、スクリプトをPowerShellで作成することをお勧めします。 –

+0

@Bill_Stewart私たちはプログラミングのヘルプフォーラムに参加しており、OPはバッチファイルの問題について助けを求めています。このように 'Python'を使うように彼に言わないと、彼のコードもLinuxでも動くでしょう。 'batch'の' loop'はPowershellのように非常に便利です。あなたはそれを使って学ぶだけです。 – SachaDee

+0

@SachaDee - ちょうど良いツールを提案しています。 PythonはWindowsに組み込まれていないので、良い選択ではないかもしれません。 PowerShell(Windows 7以降)は、cmd.exeより優れており(特にスクリプティングでは!)、ほとんどすべての考えられる方法で使用できます。 PowerShellに慣れていない場合は、時間の投資に多大な報酬が与えられるので、覚えておいてください。 –

答えて

0

@echo off 
setlocal enabledelayedexpansion 

for /f %%i in ('wmic logicaldisk where "mediatype=12" get caption ^| findstr ":"') do (
    for /f %%x in ('wmic logicaldisk where "DeviceID='%%i'" get Size^,FreeSpace ^/format:value ^| findstr [0-9]') do set %%x 
    call:next %%i !Freespace:~0,-10! !Size:~0,-10! 
) 

exit/b 

:next 
    set /a percentage=(%2 * 100)/%3 
    echo %1 - %2 Gb of %3 Gb [!Percentage!^% Free] 

それからちょうど、他の要素を追加するには、デバッグが容易になります。

関連する問題