Mike Austin
Mike Austin

Reputation: 3

Running programs via shell

I am running Windows 7x64 and Excel 2010x32. I call 32bit dos programs (written in Fortran) via vba using ExecCmd (a Microsoft function that waits for a command prompt process to finish). I send a command line to this function that explicitly contains the program path and the paths of the input file and output file.

This runs fine on my PC and also on a company PC running the same software (OS and Office) and for which I have general access to the C: drive.

On other company PCs, where there is not general access to the C: drive, this does not work - i.e. the dos programs do not produce an output file. On these PCs, I can still run the program at the command prompt manually. It is just that calling this command prompt does not work via Excel VBA.

Now the strange thing is that I can successfully run one of these programs by adding "cmd.exe /c" at the beginning of the command line. That would appear to be running a command prompt within a command prompt (!). The other program (which, incidentally, is quite a bit bigger) does not work at all via vba on these PCs. I need to be able to provide other employees with something that works.

Can anyone shed some light on what is happening here and suggest a work around? I could past some code, but I think the above should be self explanatory.

Upvotes: 0

Views: 566

Answers (1)

Harry Johnston
Harry Johnston

Reputation: 36308

You're confusing the command shell with the console window. In this context, the distinction is critical.

Console-mode programs (aka "command-line programs") require a console window to provide input and output. When a console-mode program is launched from a GUI program, Windows automatically creates a console window for it (unless instructed otherwise).

The command shell (aka "Command Prompt") is cmd.exe, a console-mode program.

The important point here is that not every console window has an instance of cmd.exe running in it. When a console-mode program is launched from a GUI program, Windows automatically creates a console window but does not automatically create an instance of cmd.exe. If you want to pass a command to cmd.exe you have to do so yourself, or use a run-time library routine that does it for you.

ExecCmd does not do this; it runs the program directly. So passing cmd /c <command> to ExecCmd is not "running a command prompt within a command prompt" at all. Without the cmd /c you aren't running a command shell command, you're just launching an executable.

There are any number of reasons why the command you're passing might need to be given to the command shell. For example:

  • it might be a built-in command like dir or type which only exists within the command shell;

  • it might include redirection or pipelining operators, or environment variable substitution;

  • it might be a script rather than an executable.

There are other cases. If you show us the command line being passed to ExecCmd we may be able to provide more specific advice. (The fact that the same command line is apparently working on some machines is puzzling, but can't be addressed without more information.)

Upvotes: 4

Related Questions