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

Hi, I am trying to run a .bat file from Perl script. I use system() or exec to execute the .bat file, but the file runs in Unix shell and not on dos prompt. How do i make the bat file to execute in dos prompt?

Replies are listed 'Best First'.
Re: How to execute dos commands from Perl
by GrandFather (Saint) on May 31, 2012 at 06:54 UTC

    You need to get your story straight. Are you trying to run a DOS/Windows batch file, or are you trying to run a DOS/Windows executable? What operating system are you using? What have you tried and how did it fail?

    Pretend we know nothing at all about what you are trying to do nor about the system you are trying to do it on. That shouldn't be too hard because it is actually the case - no pretence needed!

    True laziness is hard work
      Hi, I am trying to execute a .NET exe from Perl script which should execute on dos prompt adn return the control back to perl script. The .NET exe would be sending fax to the users adn create a .done file, which would be read from the perl script after the execution.
        Then how come you say it was executed in a UNIX shell? Are you using Cygwin? Are you trying to execute a .Net program on UNIX?

        Just to be clear, by "dos prompt" and "dos commands" do you mean the Windows cmd.exe shell?

        IMHO, if you want to execute a .net program on windows, you should use someting like this:

        my $CmdNgen = "$fw20cmd\\ngen.exe"; my $ParmNgenPause = "ngen queue pause"; my $rc; $rc = ProcessItWin( $CmdNgen, $ParmNgenPause ); sub ProcessItWin { my ( $ProcessCmd, $ProcessParam ) = @_; my $ProcessObj = undef; #print "Start $ProcessCmd $ProcessParam\n"; my $rc = Win32::Process::Create( $ProcessObj, $ProcessCmd, $Pr +ocessParam, 0, NORMAL_PRIORITY_CLASS, q{.} ) or $rc = ErrorReport($ProcessCmd); my $pid = $ProcessObj->GetProcessID(); $ProcessObj->Wait(INFINITE); return $rc; } sub ErrorReport { my $cmd = shift; print "\n *** Error CreateProcess: Command=$cmd, ", Win32::For +matMessage( Win32::GetLastError() ), "\n"; return 0; }

        Also please read perldoc Win32::Process

Re: How to execute dos commands from Perl
by NetWallah (Canon) on May 31, 2012 at 06:12 UTC
    In a WindowsXP/cygwin environment, I was able to get this to work:

    perl -e "print for qx|c:/windows/system32/cmd.exe /c test.bat| "

    Note the use of the full path to cmd.exe, using FORWARD SLASHES.

                 I hope life isn't a big joke, because I don't get it.
                       -SNL

      Hi, Thanks for your quick response. But i need to call up a .exe from within a perl script and after execution the command should return to next step in perl script. Can you please help me out on it?
        Yes - the 'qx' and backticks provide that functionality. The perl script waits for the command to complete, then executes the next perl command.
        use strict; use warnings; my $externalExe="C:/path/to/myprog.exe"; print "Starting external program...\n"; print for qx|$externalExe 2>&1|; # Executes the program, and prints it +'s output print "Program $externalExe run completed.\n";

                     I hope life isn't a big joke, because I don't get it.
                           -SNL

        If you want to execute a .bat under Windows, then you need to have a script file that Windows understands.

        I suggest that you type: "help start"
        to see the options for that to make a more complex Windows .bat file.

        To capture the output of a shell command (Windows or not) in Perl in the most simple way, use "backticks".

        #!/usr/bin/perl -w use strict; my $result1 = `dir`; print $result1; my $result2 = `dir *.txt`; print $result2;