【问题标题】:How can I resolve the path of a command (e.g.- gacutil) progmatically?如何以编程方式解析命令的路径(例如 - gacutil)?
【发布时间】:2016-11-03 18:27:56
【问题描述】:

我需要以编程方式调用 gacutil 以从 GAC 卸载一些二进制文件。

为了能够从 cmd 使用 gacutil 命令,我必须将 gacutil 路径添加到 PATH 变量中。但是现在我正在尝试从代码运行 gacutil,我需要动态解析 gacutil 的路径才能启动该进程。但我还没有找到解决 gacutil 路径的方法。有吗?

我确实尝试按照this 答案中的建议扩展 PATH 环境变量,但由于 PATH 变量上有多个目录(用分号分隔),因此没有简单的方法来解析 gacutil 路径。

但显然,当我在 cmd 中键入 gacutil 时,它会以某种方式解决搜索 PATH 变量中所有可用目录的路径。如何通过代码实现这一点?

【问题讨论】:

    标签: c# cmd environment-variables gac


    【解决方案1】:

    如果PATH环境变量中指定了路径,则不需要知道路径:

    Process p = new Process();
    p.StartInfo.FileName = "gacutil";
    p.Start();    
    //it automatically resolves path basin on PATH environment variable
    

    .

    【讨论】:

    • 我不能使用 UseShellExecute=true,因为我需要重定向标准输出
    • 谢谢!我收到异常-“系统找不到指定的文件。”但重新启动VS解决了这个问题:)
    【解决方案2】:

    使用它,使用 Process.Start 启动它并读取输出:

    WHERE gacutil
    

    【讨论】:

      【解决方案3】:

      当然,如果它在路径中,则无需像@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;
           }
      }
      

      【讨论】:

        【解决方案4】:

        如果您想在 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%
        

        【讨论】:

          猜你喜欢
          • 2020-11-16
          • 1970-01-01
          • 2010-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多