Dax T. Games [EMAIL PROTECTED] wrote: > How would I determine if a file existed in a directory in the > PATH environment variable on a Windows box with Perl. If the > file exists I want to return the full path to the file. > > The functionality I want is similar to 'which' on Unix/Linux.
Dax, I second the folks recommending the Perl Power Tools (ppt) if you want a straight implementation of Unix commands in Perl. I wrote my own enhanced which.pl command which could do more than the standard Unix "which": 1. If on a Win32 platform, it is PATHEXT aware and will match without typing the suffix. And in such a case it only matches files that have a suffix in the PATHEXT list. Example: C:\>which gvim C:\WINNT\gvim.bat C:\Pkgs\vim\vim61\gvim.exe 2. Each directory in the PATH environment variable is searched and all matches are displayed (not just the first). You can see this in the example above. This is useful to determine if you have more than one executable of the same basename in various directories of your PATH. The first file with the given basename hides the others from being executed (unless a full path is specified). 3. Can type in a wildcard character '*' or '?' to have it match any executables with that filename pattern. Example: C:\> which.pl jav* C:\Java\j2sdk1.4.1_02\bin\java.exe C:\Java\j2sdk1.4.1_02\bin\javac.exe C:\Java\j2sdk1.4.1_02\bin\javadoc.exe C:\Java\j2sdk1.4.1_02\bin\javah.exe C:\Java\j2sdk1.4.1_02\bin\javap.exe C:\Java\j2sdk1.4.1_02\bin\javaw.exe C:\WINNT\system32\java.exe C:\WINNT\system32\javaw.exe Another example illustrating two wildcards: C:\>which *nd* C:\Perl\bin\find2perl.bat C:\Pkgs\bin\pfind.pl C:\Perl\bin\find2perl.bat C:\WINNT\system32\append.exe C:\WINNT\system32\command.com C:\WINNT\system32\expand.exe C:\WINNT\system32\faxsend.exe C:\WINNT\system32\find.exe C:\WINNT\system32\findstr.exe C:\WINNT\system32\nddeapir.exe C:\WINNT\system32\rundll32.exe C:\WINNT\system32\sndrec32.exe C:\WINNT\system32\sndvol32.exe 4. A command line option ('-l' or '--list') to provide a directory listing for matching items. Example: C:\>which -l jav* 2003/02/20 14:17:34 24677 C:\Java\j2sdk1.4.1_02\bin\java.exe 2003/02/20 14:17:34 28794 C:\Java\j2sdk1.4.1_02\bin\javac.exe 2003/02/20 14:17:34 28800 C:\Java\j2sdk1.4.1_02\bin\javadoc.exe 2003/02/20 14:17:34 28794 C:\Java\j2sdk1.4.1_02\bin\javah.exe 2003/02/20 14:17:34 28790 C:\Java\j2sdk1.4.1_02\bin\javap.exe 2003/02/20 14:17:34 28775 C:\Java\j2sdk1.4.1_02\bin\javaw.exe 2003/02/20 14:17:38 24677 C:\WINNT\system32\java.exe 2003/02/20 14:17:38 28775 C:\WINNT\system32\javaw.exe 5. A command line option ('-m' or '--md5') to compute a MD5 digest checksum for matching items. Example: C:\>which -m jav* 9f455abce73150ed13707c1827589501 C:\Java\j2sdk1.4.1_02\bin\java.exe 96fa7cc38ef36a16750cdfaeb7ce7c84 C:\Java\j2sdk1.4.1_02\bin\javac.exe 2e2752ccf39d3d8d5654153b23ef44d0 C:\Java\j2sdk1.4.1_02\bin\javadoc.exe d967925f345b70bcc2c379b0e9e65c35 C:\Java\j2sdk1.4.1_02\bin\javah.exe 29bf016d4642956a47364b0e0b612d36 C:\Java\j2sdk1.4.1_02\bin\javap.exe 2ec1d702ff5252e88e12b124c53f9099 C:\Java\j2sdk1.4.1_02\bin\javaw.exe 9f455abce73150ed13707c1827589501 C:\WINNT\system32\java.exe 2ec1d702ff5252e88e12b124c53f9099 C:\WINNT\system32\javaw.exe Note: the '-m' and '-l' options can be combined: C:\>which -l -m java 9f455abce73150ed13707c1827589501 2003/02/20 14:17:34 24677 C:\Java\j2sdk1.4.1_02\bin\java.exe 9f455abce73150ed13707c1827589501 2003/02/20 14:17:38 24677 C:\WINNT\system32\java.exe This is good for finding truly duplicate executables. 6. On Win32 platforms, the current directory '.' is prepended to the PATH list as this is implied on Win32 systems (this is not implied on Unix systems). Example: C:\Temp>which which .\which.pl C:\Pkgs\bin\which.pl 7. I also implement multi-level debugging and tracing to allow more explanation of the breakout of the filename argument and the PATH and PATHEXT environment variables. Example: C:\Temp>which -# which* Debugging C:\Temp\which.pl -d which version = v1.4 2003/09/14 debug = 1 filename = which PATHEXT = .COM .EXE .BAT .CMD .VBS .VBE .JS .JSE .WSF .WSH .PL Matches: .\which.pl C:\Pkgs\bin\which.pl C:\Pkgs\bin\which0.bat which.pl: Finished This may be overkill for your needs, but I have found this to be an extremely useful utility on my Win32 platform. I add to it occasionally when I find more things that I want it to be able to do. You can get it here: http://marms.sourceforge.net/perl/ -- Mike Arms _______________________________________________ Perl-Win32-Users mailing list [EMAIL PROTECTED] To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs