86

For example what is the alternative to this command without quotation marks:

CD "c:\Documents and Settings"

The full reason I don't want to use quotation marks is that this command DOES work:

   SVN add mypathname\*.*

but this command DOES NOT work :

   SVN add "mypathname\*.*"

The problem being when I change mypathname for a path with spaces in it I need to quote the whole thing. For example:

SVN add "c:\Documents and Settings\username\svn\*.*"

But when I try this I get the following error message:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
  • 2
    you meant you have a good reason for 'not' wanting to use quotation marks. – Thomas May 4 '11 at 12:56
  • Why, is your quotation mark key broken? :) – slhck May 4 '11 at 12:57
  • 3
    @slhck Don't worry my shift key and number 2 key are perfectly ok! I'm using a command that doesn't appear to allow wildcards when they apear inside quotation marks thats all! – David May 4 '11 at 13:06
  • 1
    @MarkBooth and @WeltenWanderer nice try but unfortunately this doesn't work. In all 3 cases I get an "svn: Error resolving case of ....." – David May 4 '11 at 14:00
  • 1
    Have you tried old 8.3 formatting of the name ( DOCUME~1 )? – Justin Pearce May 4 '11 at 15:11
53

It almost all works for me, but have you perhaps tried line5.. escaping the space with a caret symbol (^)

1 C:\Documents and Settings\user>cd ..

2 C:\Documents and Settings>cd ..

3 C:\>cd Documents and Settings

4 C:\Documents and Settings>cd..

5 C:\>cd Documents^ and^ Settings

6 C:\Documents and Settings>cd..

7 C:\>cd C:\documents and settings

8 C:\Documents and Settings>cd..

9 C:\>

Or e.g. below where the caret really makes all the difference.

Looks from below like the caret symbol may be your answer, see line 3 below.

1 C:\>"c:\Documents and Settings\a.bat"
gaga

2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.

3 C:\>c:\Documents^ and^ Settings\a.bat
gaga

C:\>
  • since subversion is a programmer's tool, it may be appropriate for SO. here is a related question stackoverflow.com/questions/757435/… it could be you use quotes or caret to get it to svn, then perhaps you use backslash before each space – barlop May 5 '11 at 8:31
  • you could also try cygwin's svn, if curious.. with some of the example answers in that question and see if any or variations of them work for you. – barlop May 5 '11 at 8:47
  • 5
    The caret symbol does directly answer my question so I'll accept your answer. Unfortunately the SVN command doesn't seem to recognise it! If I try it I get this error message "svn 'C:' is not a working copy". I have another way around it though and that's to simply 'cd' to the directory first then execute the SVN command once there. I can even chain the two commands together in a single line using the && operator: cd "c:\Documents and Settings\username\svn" && SVN add *.* – David May 5 '11 at 8:55
  • in the CD example, caret isn't necessary, CD doesn't need space escaped – barlop Feb 7 '14 at 2:53
  • 1
    @Chinggis6 interesting.. it doesn't work for DIR either. Both copy and dir are built in commands.. though so is CD. Though copy and dir take a filename as parameter. May be worth asking on dostips forum – barlop May 14 '17 at 5:28
34

I found that putting quotes around just one part of the location works. In your case:

SVN add C:\"Documents and Settings"\username\svn\*.*

Although this uses quotation marks, the important thing to notice is that the asterisks are outside the quotation marks, so they still function correctly.

  • 7
    also if one wants to be minimalistic, one can do quotes around just the space or just the chars containing the space, e.g. C:\>cd documents" and se"ttings (though re that cd example , one doesn't need to escape spaces) – barlop Jul 30 '13 at 11:28
  • 1
    Thanks a lot. I might have upvoted 4 or 5 times if possible.. – Sayka Jan 12 '15 at 20:25
  • @Sayka The question did ask "How do I escape spaces in command line in Windows without using quotation marks?" – barlop Apr 14 '18 at 8:13
  • @barlop Sure, but the reason for no quotation marks was that the asterisk doesn't do its job when it's inside the quotation marks. The solution I've given avoids this issue because the asterisks are outside the quotation marks. This answer doesn't abide by the letter of the question, but it abides by the spirit of the question (i.e., it works for the intended purpose). – Kit Johnson Apr 17 '18 at 5:46
24

Despite the answers giving the illusion that it works, the fact is you can't sneak in spaces into usual cmd arguments. This is easy to prove:

  1. Save "echo %1" as test.bat. This batch file will output the first argument which cmd passes us.

  2. Now, try and run test.bat, setting the value of %1 to foo bar. (Note that there's a space char between foo and bar.)

  3. Trial-and-error for a few years and realize that there's no way to do it. Folks will suggest to escape using ^, yet test.bat foo^ bar will not output foo bar.

So, there's no way to get the output foo bar, and the closest we can get is running test.bat foo" "bar which produces foo" "bar, or running test.bat "foo bar" which produces "foo bar".


Now, the reason the other answers appear to work is because cd does it's own additional parsing, diverging from the behavior of usual argument passing (the usual %1, %2, %3 and etc in typical batch files).

For example, consider the peculiar command:

cd c:\documents and settings \some folder with spaces

Why does it work? This is due to cd itself doing something equivalent of joining the 7 usual arguments into one logical one. According to cmd argument passing norms, we see 7 arguments:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces

It's as though cd has joined all the 7 arguments into one logical one, doing something akin to array.join(" "), which produces the path:

c:\documents and settings \some folder with spaces

Note that this behavior is peculiar to cd only (and some other functions). It has nothing to do with usual argument passing.


Indeed, cd has another peculiarity. Remember we stated above that we couldn't get the output foo bar? The closest output we can get is by running:

test.bat foo" "bar

which produces foo" "bar, or:

test.bat "foo bar"

which produces "foo bar", or:

test.bat "foo "bar

which produces "foo "bar, or:

test.bat foo" bar"

which produces foo" bar", or:

test.bat "foo b"ar

which produces "foo b"ar, or:

test.bat fo"o bar"

which produces fo"o bar", or:

test.bat fo"o ba"r

which produces fo"o ba"r, or:

test.bat "fo"o" bar"

which produces "fo"o" bar", or:

test.bat "f""o""o"" ""b""a""r":

which produces "f""o""o"" ""b""a""r", or even:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":

which produces """"f"""o""""o"" ""ba"""r"""""""""".

All the above examples have one similarity, which is they'll produce foo bar after we trim off the " chars. cd's author must have realized this too... if we were to infer from cd's peculiar behavior which trims off all " it receives, allowing all of these commands to work:

  • cd c:\documents and settings

  • cd "c:\documents and settings"

  • cd "c:"\"documents and settings"

  • cd c:\"documents" "and" "settings"

  • cd c:\"docu"ments an"d set"tings"

  • cd c:"\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs

  • cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs

  • 14
    What a mess windows batch programming... – Klangen Mar 7 '16 at 13:26
  • Thanks. Can we determine if CD is using argv[] or GetCommandLine() ? pastebin.com/raw/t55iv0JS – barlop Apr 14 '18 at 8:21
7

The short-filename appears to work like a breeze.

"E:\Progra~1\Java\Eclipse\eclipse.exe" -vmargs -Xms1024m -Xmx2048m

For boosting up the memory.. ;)

  • 8
    it may not work if short filename has been disabled – phuclv Dec 5 '14 at 17:22
3

Use the 8.3 short-filename. For example:

If exist c:\docume~1 goto :Ifoundthesucker
2

For thoose talking about 8.3 replacement, did you know this two things:

  • 8.3 can be set to disabled (or enabled) on NTFS so they may not allways exists
  • 8.3 name of a file/folder can change without been notificed just by creating, renaming or deleting other things on same folder

So c:\docume~1 can point to:

  • No where (be invalid)
  • The folder you want
  • Another folder
  • A variable folder along time

It is not safe, unless you get the short name and use it in atomic operations.

Said that, it is very uncommon they change, but it is very common they not exist.

If you want to know if 8.3 exists for a particular folder/file test it with paramenter /X on a dir command... or encapsulate it on a for to only get that part, etc.

If more about how to enable/disable 8.3 on NTFS, see M$ web:

https://support.microsoft.com/es-es/help/121007/how-to-disable-8.3-file-name-creation-on-ntfs-partitions

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.