Board logo

标题: [系统相关] 【已经解决】批处理如何获取Path系统变量中的指定路径(目录)? [打印本页]

作者: vikimono    时间: 2016-4-23 21:27     标题: 【已经解决】批处理如何获取Path系统变量中的指定路径(目录)?

本帖最后由 vikimono 于 2016-5-2 14:15 编辑

我想实现的是读取环境变量中%PATH%的目录来确定某个软件运行目录

以下是我测试电脑上的%PATH%

D:\Test\Oracle\Oracle11gClient_4\Bin;D:\Test\Oracle\Oracle11g_4\Bin;D:\Test\Oracle\Oracle11g_4\Bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\

我想获取 D:\Test\Oracle\Oracle11g_4\Bin,因为习惯问题有时候会在C,D,E,F都有可能,又国Oracle版本问题有时会是D:\Test\Oracle\Oracle11g_2\Bin,所以特征字符串可以是Oracle11g_
  1. @echo off
  2. set str=Oracle11g_
  3. set new="%path:;=" "%"
  4. (for %%a in (%new%) do (
  5. set mydir=%%~a
  6. ))|findstr /ic:"%str%"
  7. echo %mydir%
  8. pause
复制代码
实际上变量mydir为空的,set赋值在这里为什么会失效?
如果有有效,我还有一个问题,如何CD到这个目录呢?如果当前盘符与软件盘符一致可以直接进入,不在一个盘符如何判断软件目录所以盘符呢?

请指教,谢谢!
作者: codegay    时间: 2016-4-23 21:33

  1. cd /d
复制代码

作者: /zhqsystem/zhq    时间: 2016-4-24 01:33

回复 1# vikimono
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ("%path%") do (set "name_b=%%i"
  3. for /l %%n in (1,1,8191)do (
  4.   for /f "tokens=1,* delims=;" %%j in ("!name_b!;;;;;")do (set "name_b=%%k"
  5.    echo,%%j
  6.   )
  7. )
  8. )
  9. pause
复制代码

作者: Nsqs    时间: 2016-4-24 15:57

回复 3# /zhqsystem/zhq
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "s=%path%#"
  4. :re
  5. for /f "tokens=1,* delims=;" %%1 in ("!s!")do (
  6. set s=%%2
  7. set result=%%1
  8. echo !result:#=!
  9. )
  10. if "%s:~-1%"=="#"  goto re
复制代码

作者: /zhqsystem/zhq    时间: 2016-4-24 19:17

回复 4# Nsqs
回错楼了?
作者: pcl_test    时间: 2016-4-25 20:44

  1. //&cls&cscript -nologo -e:jscript "%~f0"&pause&exit
  2. var wshell = new ActiveXObject('WScript.Shell');
  3. WSH.echo(wshell.ExpandEnvironmentStrings('%path%').match(/[^;]*Oracle11g_[^;]*/));
复制代码

作者: WHY    时间: 2016-4-25 22:30

  1. setlocal enabledelayedexpansion
  2. echo;!Path:;=^
  3. !>~tmp.$
  4. find /i "关键字" < ~tmp.$
复制代码

作者: WHY    时间: 2016-4-25 22:34

  1. [regex]::match($env:path, '[^;]*Oracle11g_[^;]*').Value
复制代码

作者: vikimono    时间: 2016-5-2 14:11

感谢各位,大开眼界啊。
我目前采用了读取注册表方法
  1. for /f "tokens=2,*" %%i in ('reg query "HKLM\SOFTWARE\Wow6432Node\ORACLE" ^| find /i "ORACLE_HOME"') do SET "dbHM=%%j"
  2. if "%dbHM%"=="" goto BSTOP
  3. %dbHM:~0,2%
  4. CD %dbHM%\BIN
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2