blackadder has asked for the wisdom of the Perl Monks concerning the following question:

Hello all, Me again. This is a quick one, how can I tell if the object I am working on is a machine or directory or share. The reason is that I would like to make my script accept arguments (paths) to a computer or a share or a logical drive or a directory (remote or local). Examples:
My_script server1
My_script \\server1\SharedArea
My_script \\server\D$
Many Thanks in advance brothers (a little hint with a little example can go a long way - even page number on either Dave Roths books will do - as second option).

Replies are listed 'Best First'.
Re: Determining command line object type
by BrowserUk (Patriarch) on Jun 27, 2002 at 18:14 UTC

    More of a question than ans answer but...wouldn't the -X functions (operators?) do (most of?) the testing you need?

    From perlfunc "-X":

    -f File is a plain file. -d File is a directory. -l File is a symbolic link. -p File is a named pipe (FIFO), or Filehandle is a pipe. -S File is a socket. -b File is a block special file. -c File is a character special file. -t Filehandle is opened to a tty.

    Otherwise, if this is on a Win32 system - Win32API::GetDriveType and/or Win32::GetFiletype maybe what you need.

Re: Determining command line object type
by Rex(Wrecks) (Curate) on Jun 27, 2002 at 17:20 UTC
    Update: See BrowserUK's response for handling file types. However you will still need to work in logic to figure out is it is a server.
    Note: All of what is below is using system(), there may be modules out there but I don't know them off the top of my head.

  • First, you can parse for <drive_letter>:\ to find out if it is a local absolute path.
  • Second, Parse for ^\\<blah> to tell you if there is a UNC path being used.
  • File::Find will be able to tell you if it is a local file.
  • If none of the above is true, try system("net view \\$firstvar");, this will tell you if it is a REACHABLE machine
  • Point to note, the difference between a regular share and \\server\d$ is only the fact that d$ is a hidden administrative share. They are both still shares.

    There will be more error checking you will want to do (such as checking for reachable path if the ^\\ parse is successful), and possibly more corner cases, but this should get you going in the right direction.

    "Nothing is sure but death and taxes" I say combine the two and its death to all taxes!