2016-06-27 23 views
0

環境変数が存在しない場合に設定しようとしています。存在する場合は、スクリプトが終了します。私はこの次のコードで試しています。バッチファイルを使用して環境変数を設定していない場合

@echo off 
echo %machine% > c:\machineoutput.txt 
findstr /I /c:"C:\Oracle\Ora12c\perl\bin" c:\machineoutput.txt 
if %errorlevel% == 0 (
    goto SETPATH 
) else (
    EOF 
) 
:SETPATH 
setx /m machine "%oracle_home%\perl\bin;%path%" 
:EOF 
exit 

しかし、それはどのように動作していないのですか。私は変数を設定することができますが、変数が存在する場合でも、変数を設定して終了します。

私が間違っていることを見つけ出すのを手伝ってください。

+1

なぜ他の支店の任意の場所に行かなくても、あなた最初のブランチで '後藤SETPATH'だけ' EOF'しますか? –

+0

@LưuVĩnhPhúcこのバッチファイルは別のバッチファイルから呼び出されているので、パスが存在すると、このバッチファイルは終了し、呼び出された場所の親バッチファイルが操作を再開します。このファイルのEOFに行きますパスが存在していない場合は、パスを設定します。 – n00b

+0

いいえ、EOFは有効なコマンドではないため、エラーが発生します。トーEOFラベルに行きたい場合は、 'goto EOF'を使います –

答えて

0

C:\Oracle\Ora12c\perl\bin%oracle_home%\perl\binは、システム環境変数PATH に追加するかどうかを決定するために非標準環境変数machineに存在するかどうかをチェックなぜ私は知りません。このディレクトリパスの存在について、PATHシステムを確認することをお勧めします。

EOFは有効なコマンドではありません。したがって、Windowsコマンドプロセッサーはエラーメッセージを出力し、次のコマンドラインがsetxの行で続行されます。これが、バッチコードが機能しない理由です。 ELSEブランチのコマンドはgoto :EOFである必要があります。

は、はるかに良い%oracle_home%\perl\bin又はその拡張等価物がシステムに存在する場合システム内に存在しない場合は、パスシステムPATH代わりにプリペンドを付加PATHをチェックするコードを以下であろう。このバッチコードのテンプレートとして使用Why are other folder paths also added to system PATH with SetX and not only the specified folder path?にこのバッチコードの読み取り解答の詳細については

@echo off 
if not exist "%oracle_home%\perl\bin\*" goto :EOF 
setlocal EnableExtensions DisableDelayedExpansion 

for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
     set "SystemPath=%%P" 
     goto CheckPath 
    ) 
) 
echo Error: System environment variable PATH not found. 
echo. 
endlocal 
pause 
goto :EOF 

:CheckPath 
setlocal EnableDelayedExpansion 
set "Separator=" 
set "PathToAdd=%%oracle_home%%\perl\bin" 
set "OraclePerlPath=%oracle_home%\perl\bin" 
if not "!SystemPath:~-1!" == ";" set "Separator=;" 
if "!SystemPath:%PathToAdd%=!" == "!SystemPath!" (
    if "!SystemPath:%OraclePerlPath%=!" == "!SystemPath!" (
     %SystemRoot%\System32\setx.exe PATH "!SystemPath!%Separator%%PathToAdd%" /M 
    ) 
) 
endlocal 
endlocal 

。それはなぜ問題のバッチコードが間違いなく全くうまくいかないのかを説明します。

注:コマンドSETXは、Windows XPではデフォルトでは使用できません。

使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg /?reg query /?
  • set /?
  • setlocal /?
  • setx /?
関連する問題