如何以编程方式解析命令的路径(例如 - gacutil)?
How can I resolve the path of a command (e.g.- gacutil) progmatically?
我需要以编程方式调用 gacutil 以从 GAC 中卸载一些二进制文件。
为了能够从 cmd 使用 gacutil 命令,我必须将 gacutil 路径添加到 PATH 变量。但现在我正在尝试从代码中 运行 gacutil,我需要动态解析 gacutil 的路径才能启动该进程。但是我还找不到解决 gacutil 路径的方法。有吗?
我确实尝试按照 this 答案中的建议扩展 PATH 环境变量,但由于 PATH 变量上有多个目录(以分号分隔),因此没有简单的方法来解析 gacutil 路径。
但很明显,当我在 cmd 中键入 gacutil 时,它会以某种方式解析通过 PATH 变量中所有可用目录搜索的路径。我怎样才能通过代码实现这一点?
如果在PATH环境变量中指定了路径,则不需要知道路径:
Process p = new Process();
p.StartInfo.FileName = "gacutil";
p.Start();
//it automatically resolves path basin on PATH environment variable
.
使用它,使用 Process.Start 启动它并读取输出:
WHERE gacutil
当然,如果它在路径中,您不需要像@nopeflow 回答的那样搜索它。但是如果你真的想得到 PATH
环境变量中任何文件的路径,你可以这样做:
string[] PathDirs = Environment.GetEnvironmentVariable("PATH").Split(';');
string GACdir="";
foreach (string path in PathDirs)
{
if (File.Exists(Path.Combine(path,"gacutil.exe")))
{
GACdir=path;
}
}
如果您想找到 PATH 中的所有可执行文件,以下 cmd.exe
脚本将识别它们。
@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@SET EXITCODE=1
:: Needs an argument.
@IF "x%1"=="x" (
@ECHO Usage: %0 ^<progName^>
GOTO TheEnd
)
@set newline=^
@REM Previous two (2) blank lines are required. Do not change!
@REM Ensure that the current working directory is first
@REM because that is where DOS looks first.
@PATH=.;!PATH!
@FOR /F "tokens=*" %%i in ("%PATH:;=!newline!%") DO @(
@IF EXIST %%i\%1 (
@ECHO %%i\%1
@SET EXITCODE=0
)
@FOR /F "tokens=*" %%x in ("%PATHEXT:;=!newline!%") DO @(
@IF EXIST %%i\%1%%x (
@ECHO %%i\%1%%x
@SET EXITCODE=0
)
)
)
:TheEnd
@EXIT /B %EXITCODE%
我需要以编程方式调用 gacutil 以从 GAC 中卸载一些二进制文件。
为了能够从 cmd 使用 gacutil 命令,我必须将 gacutil 路径添加到 PATH 变量。但现在我正在尝试从代码中 运行 gacutil,我需要动态解析 gacutil 的路径才能启动该进程。但是我还找不到解决 gacutil 路径的方法。有吗?
我确实尝试按照 this 答案中的建议扩展 PATH 环境变量,但由于 PATH 变量上有多个目录(以分号分隔),因此没有简单的方法来解析 gacutil 路径。
但很明显,当我在 cmd 中键入 gacutil 时,它会以某种方式解析通过 PATH 变量中所有可用目录搜索的路径。我怎样才能通过代码实现这一点?
如果在PATH环境变量中指定了路径,则不需要知道路径:
Process p = new Process();
p.StartInfo.FileName = "gacutil";
p.Start();
//it automatically resolves path basin on PATH environment variable
.
使用它,使用 Process.Start 启动它并读取输出:
WHERE gacutil
当然,如果它在路径中,您不需要像@nopeflow 回答的那样搜索它。但是如果你真的想得到 PATH
环境变量中任何文件的路径,你可以这样做:
string[] PathDirs = Environment.GetEnvironmentVariable("PATH").Split(';');
string GACdir="";
foreach (string path in PathDirs)
{
if (File.Exists(Path.Combine(path,"gacutil.exe")))
{
GACdir=path;
}
}
如果您想找到 PATH 中的所有可执行文件,以下 cmd.exe
脚本将识别它们。
@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@SET EXITCODE=1
:: Needs an argument.
@IF "x%1"=="x" (
@ECHO Usage: %0 ^<progName^>
GOTO TheEnd
)
@set newline=^
@REM Previous two (2) blank lines are required. Do not change!
@REM Ensure that the current working directory is first
@REM because that is where DOS looks first.
@PATH=.;!PATH!
@FOR /F "tokens=*" %%i in ("%PATH:;=!newline!%") DO @(
@IF EXIST %%i\%1 (
@ECHO %%i\%1
@SET EXITCODE=0
)
@FOR /F "tokens=*" %%x in ("%PATHEXT:;=!newline!%") DO @(
@IF EXIST %%i\%1%%x (
@ECHO %%i\%1%%x
@SET EXITCODE=0
)
)
)
:TheEnd
@EXIT /B %EXITCODE%