/// <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); } } } }
/// <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( "Version {0}\r\nFreeware written by Gerson Kurz (http://p-nand-q.com)", AppVersion.Get())); Args.Add(InputArgType.StringList, "extension", null, Presence.Optional, "search for extension <name>, can be a ; separated list"); Args.Add(InputArgType.StringList, "dir", null, Presence.Optional, "add directory <name>, can be a ; separated list"); Args.Add(InputArgType.Flag, "recursive", false, Presence.Optional, "search directories recursively"); Args.Add(InputArgType.Flag, "single", false, Presence.Optional, "stop after the first find result"); Args.Add(InputArgType.RemainingParameters, "FILE {FILE}", null, Presence.Required, "one or more files to find"); Args.Add(InputArgType.Parameter, "env", "PATH", Presence.Optional, "environment variable, defaults to PATH"); if (Args.Process(args)) { Filenames = Args.GetStringList("FILE {FILE}"); Directories = Args.FindOrCreateStringList("dir"); string EnvironmentVariableName = Args.GetString("env"); if( EnvironmentVariableName != null ) { foreach (string token in Environment.GetEnvironmentVariable(EnvironmentVariableName, EnvironmentVariableTarget.User).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( Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)); Directories.Add( Environment.GetFolderPath(Environment.SpecialFolder.System)); Directories.Add( Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.System))); AddEnvBasedDirectories("PATH"); } StringList.MakeUnique(ref Directories, 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 ) { foreach (string foundname in Locate(filename)) { if (!Contains(FoundItems, foundname)) { FileInfo fi = new FileInfo(foundname); Console.WriteLine("{0} [{1}, {2} bytes]", foundname, fi.LastWriteTime, fi.Length); FoundItems.Add(foundname); if (Args.GetFlag("single")) break; } } } } }