shell command with space in path/file name does not work 
Author Message
 shell command with space in path/file name does not work

The following is a compilation of several posts I've given in the past regarding the Shell
command. Your question is answered in there; the rest of the material is for future


You can use the Shell command. To execute internal DOS command (Dir, Copy, etc. as well as
redirection of screen output), the command processor must be specified (using the Environ
function and "comspec" as its argument returns the correct command processor path on NT
and non-NT systems) . Specifying the command processor is safe & generic and will work
with non-internal commands also. That syntax, using an XCopy command as an example is:

Shell  Environ("comspec") & " /c xcopy """ & _
         Source & """ """ & Destination & """ " & Option, vbHide

You set the Source and Desination (string variables) to the appropriate paths and the
Option (string variable), if any, which can be found by opening an MSDOS Prompt window and
typing xcopy /?. (Note: You can type /? after any DOS command at a DOS prompt to list the
available options for that command.) One more example would be to list all the files in a
directory including subdirectories and subdirectories of subdirectories and all of their

  CommandLine = "dir """ & FileSpec & _
                             """ /s/b > """ & RedirectTo & """"
  Shell Environ("comspec") & " /c " & CommandLine, vbHide

Here, the output of a Dir command is redirected to a file-path you specify in the
RedirectTo (string variable). The /s/b are options to the Dir command that tell it to
recurse throught its subdirectories and not to include header or summary information.

I used a variable for the file name so that I could more easily explain the benefit of
encasing it in quotemarks. If you redirect to a file that has spaces in its name, or if
there are spaces in the path specification itself, then the filename *must* be quoted to
protect the spaces from DOS's desire to use them as delimiters. (That's what all those
quotemarks in the Shell statement are for.) If the filename doesn't have spaces in it, the
quotes aren't necessary BUT they don't hurt either. Hence, the above will work with

As for your PING question, something like the following should work:

     strIP = ""
     Shell Environ("comspec") & " /c ping " & _
              strIP & " > """ & RedirectFile & """", vbHide

Although you didn't specify it in your original post, I assume you want to use vbHide for
the optional 2nd parameter to Shell. This hides the DOS window so that your user doesn't
see it. If you want the DOS window to remain visible, you would use the vbNormalFocus BUT
you must use a /k instead of a /c for the command processor argument. Basically, the /c
tells the command processor "here comes a command and, when its finished executing, close
the DOS shell it is running in" whereas the /k also tells the command processor that a
command follows, but it instructs it to leave the DOS session running.

The above assumes you do NOT have to wait for this file to be completely written before
your code continues executing. If you have to work with this file right after it is
created, consider one of these (which makes your program wait until the DOS process is

See this link


Note: This method doesn't use Shell -- it uses CreateProcessA.

Paste these lines in the (General)(Declarations) section of the form where the Shell is
being called (or remove the Private keywords and put them in a BAS module if more than one
form will use them):

Private Declare Function OpenProcess _
        Lib "kernel32" _
        (ByVal dwDesiredAccess As Long, _
         ByVal bInheritHandle As Long, _
         ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle _
        Lib "kernel32" _
        (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject _
        Lib "kernel32" _
        (ByVal hHandle As Long, _
         ByVal dwMilliseconds As Long) As Long

Call your Shell command in this form with the appropriate Shell arguments placed in the

PID = Shell( <<Put Shell Arguments Here>> )

And finally, paste the following IMMEDIATELY after the PID=Shell statement above (making
sure to handle the possible error where indicated; i.e. stop the code from falling through
to your other commands if the Shell failed):

If PID = 0 Then
     'Handle Error, Shell Didn't Work
     hProcess = OpenProcess(&H100000, True, PID)
     WaitForSingleObject hProcess, -1
     CloseHandle hProcess
End If

One note -- there are some NT systems (those with VERY tight security measures in place)
where this call won't work. No problem at all on 95/98 though.

> I am trying to use the shell command to start wordpad and
> then load a text file.  It works fine if the path does not
> have a space for example: "c:\test\test.txt"

> However, when the patch contains a space I cannot get it
> to work.  This is the command I am trying to execute.

> Shell "c:\program files\Windows NT\Accessories\wordpad.exe
> c:\program files\sfstart.txt", vbMaximizedFocus

> Any help would be greatly appreciated.

Wed, 14 Jul 2004 23:18:18 GMT  
 [ 1 post ] 

 Relevant Pages 

1. shell command with space in path/file name does not work

2. Space in Path Name passed in as command line argument

3. Passing a file path with spaces to Shell function

4. Shell to Word '97 problem - spaces in file name

5. Bad Command or File name when Shelling DOS Batch File

6. Kill/Name function don't work after shell commands

7. Shell command not working...Please help

8. Shell command not working...NEED HELP!!!!

9. Shell command not working

10. Shell (start xxxxx) not working for full Windows-path directory files (works for 8-character directory paths)

11. File Association Not Passing Long File Names to Command$

12. Shell Word with command line file name problem


Powered by phpBB® Forum Software