• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PATHから特定の文字列を抜く方法)

PATHから特定の文字列を抜く方法

このQ&Aのポイント
  • バッチファイルでPATHから特定の文字列を抜く方法について教えてください。
  • コマンドプロンプトのコマンドを使用して、特定の文字列を変数に格納する方法を知りたいです。
  • Oracleのインストールパスを抜き出す方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

No3の方のように環境変数を調べることで目的を果たせるならその方が良いと思います。 PATHを調べるのであれば、もっと簡単に書けます。 @echo off set X="%PATH:;=";"%" for %%X in (%X%) do call :sub %%X goto :EOF :sub set X=%~1 if "%X:oracle=%" neq "%X%" echo %X%

sakuraiy2
質問者

お礼

ありがとうございます。 無事できました! こんなに短いプログラムでできるなんて感動です。

その他の回答 (3)

回答No.3

No.2です。  もしOracleのホームディレクトリを調べるという目的であれば、レジストリに格納されているので以下のほうが簡単だと思います。PATH変数自体を確認することが目的ならNGですが。 for /f "tokens=*" %i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE" /s ^| findstr ORACLE_HOME ^| findstr /v ORACLE_HOME_NAME') do @set PATH_OUTPUT=%i echo %PATH_OUTPUT% ※レジストリ名はサーバのものなのでちょっと違うかも。環境に合わせてください。

sakuraiy2
質問者

お礼

レジストリを調べるという手もありましたね。 盲点でした。 ありがとうございます。

回答No.2

Windowsのバッチで文字列操作って難しいんですよね。 @echo off REM 検索したいパスのキーワードをセット set PATH_KEYWORD=oracle REM 改行を変数化(^は改行コードをエスケープしているのでこのあとは2行空ける) set LF=^ REM PATH変数のデリミタを改行コードに置換 set PATH_LF=%PATH:;=!LF!% REM 環境変数遅延展開をセット setlocal enabledelayedexpansion REM メイン処理:パスからキーワード検索してPATH_OUTPUT変数にセット for /F "delims=" %%i in ("%PATH_LF%") do echo %%i | findstr %PATH_KEYWORD% > NUL && set PATH_OUTPUT=%%i REM "bin"を削除 set PATH_OUTPUT=%PATH_OUTPUT:bin=% REM 出力してみる echo %PATH_OUTPUT% pause

sakuraiy2
質問者

お礼

>Windowsのバッチで文字列操作って難しいんですよね。 この言葉すごくずしーんってきました。 プログラム初心者にはなかなかきつかったです。 ご丁寧にありがとうございました。

回答No.1

---- ここから ---- @ECHO OFF SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION SET TempPath=%PATH% :LOOP IF "!TempPath!"=="" GOTO FIN FOR /F "tokens=1,* delims=;" %%A IN ("!TempPath!") DO @( SET TempPath=%%B ECHO %%A | FINDSTR /I /C:"Oracle" > NUL IF !ERRORLEVEL! EQU 0 ( SET OracleBinPath=%%A GOTO FIN ) ) GOTO LOOP :FIN IF NOT DEFINED OracleBinPath ( ECHO NOT FOUND. EXIT /B ) FOR /D %%A IN ("!OracleBinPath!.") DO @SET OraclePath=%%~dpA IF NOT DEFINED OraclePath ( SET OraclePath=!OracleBinPath! ) ---- ここまで ---- FOR /Fによる行単位の解析をループさせ,環境変数の遅延評価を使ってPATHを一つずつ調べていっています。 文字列の部分一致はIFではできないようなので,FINDSTRした後にERRORLEVELの遅延評価を使って確認しています。 最後に,%PATH%にはbinが付いているので,FOR /Dとループ変数の修飾子を使って,binディレクトリを取り除いています。 こんな感じでしょうか。

sakuraiy2
質問者

お礼

一番にご回答いただき、しかもとても丁寧に記載いただきありがとうございました。 こちらを採用させていただきました。 そのまま使用できて助かりました。