/// <summary> /// This program finds an executable on the PATH. It can also find other stuff on the path, but /// mostly it finds the executable.s /// </summary> /// <param name="args"></param> private void Run(string[] args) { Console.OutputEncoding = Encoding.GetEncoding(Encoding.Default.CodePage); Args = new InputArgs("which", string.Format(resource.IDS_TITLE, AppVersion.Get()) + "\r\n" + resource.IDS_COPYRIGHT); Args.Add(InputArgType.StringList, "extension", null, Presence.Optional, resource.IDS_CMD_extension_doc); Args.Add(InputArgType.StringList, "dir", null, Presence.Optional, resource.IDS_CMD_dir_doc); Args.Add(InputArgType.Flag, "recursive", false, Presence.Optional, resource.IDS_CMD_recursive_doc); Args.Add(InputArgType.Flag, "single", false, Presence.Optional, resource.IDS_CMD_single_doc); Args.Add(InputArgType.RemainingParameters, "FILE {FILE}", null, Presence.Required, resource.IDS_CMD_file_doc); Args.Add(InputArgType.Parameter, "env", "PATH", Presence.Optional, resource.IDS_CMD_env_doc); if (Args.Process(args)) { Filenames = Args.GetStringList("FILE {FILE}"); Directories = Args.FindOrCreateStringList("dir"); string EnvironmentVariableName = Args.GetString("env"); if (!string.IsNullOrEmpty(EnvironmentVariableName)) { string env = Environment.GetEnvironmentVariable(EnvironmentVariableName, EnvironmentVariableTarget.User); if (string.IsNullOrEmpty(env)) { env = Environment.GetEnvironmentVariable(EnvironmentVariableName); } EnvironmentVariablesAlreadyChecked[EnvironmentVariableName] = true; if (string.IsNullOrEmpty(env)) { Console.WriteLine(resource.IDS_ERR_invalid_env_var, EnvironmentVariableName); } else { foreach (string token in env.Split(';')) { Directories.Add(token); } } } if (FilenamesAreIncludes()) { AddEnvBasedDirectories("INCLUDE"); } else if (FilenamesAreLibs()) { AddEnvBasedDirectories("LIB"); } else { // default: use standard windows lookup Directories.Add(Directory.GetCurrentDirectory()); Directories.Add(PathSanitizer.GetWindowsDirectory()); Directories.Add(PathSanitizer.Get32BitSystemDirectory()); Directories.Add(Environment.SystemDirectory); Directories.Add(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)); Directories.Add(Environment.GetFolderPath(Environment.SpecialFolder.System)); Directories.Add(Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.System))); AddEnvBasedDirectories("PATH"); } Directories.MakeUnique(StringComparison.OrdinalIgnoreCase); List <string> Extensions = Args.FindOrCreateStringList("extension"); if (Extensions.Count == 0) { foreach (string path in Environment.GetEnvironmentVariable("PATHEXT").Split(';')) { Extensions.Add(path); } } List <string> FoundItems = new List <string>(); foreach (string filename in Filenames) { bool found = false; foreach (string foundname in Locate(filename)) { if (!Contains(FoundItems, foundname)) { FileInfo fi = new FileInfo(foundname); Console.WriteLine(resource.IDS_RESULT_PATTERN, foundname, fi.LastWriteTime, fi.Length); FoundItems.Add(foundname); if (Args.GetFlag("single")) { break; } found = true; } } if (!found) { Console.WriteLine(resource.IDS_ERR_not_found, filename); } } } }