109

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
studiohack
  • 13,477
David
  • 1,403

8 Answers8

71

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:\>
barlop
  • 25,198
45

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.

Kit Johnson
  • 1,048
33

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

Pacerier
  • 28,143
9

The short-filename appears to work like a breeze.

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

For boosting up the memory.. ;)

3

For those talking about 8.3 replacement, please note the following two things:

  • 8.3 can be set to disabled (or enabled) on NTFS, so it may not always exist.
  • The 8.3 name of a file/folder can change without notice just by creating, renaming, or deleting other things in the same folder.

So c:\docume~1 can point to:

  • Nowhere (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.

Although it is very uncommon that they change, it is common that they do not exist.

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

For more about how to enable/disable 8.3 on NTFS, see this Microsoft support article:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name-creation-on-ntfs-partitions

Pang
  • 1,017
Claudio
  • 31
2

Use the 8.3 short-filename. For example:

If exist c:\docume~1 goto :Ifoundthesucker
Synetech
  • 69,547
0

Following up on @Pang's post, and others discussing short names and the pitfalls, here's way to dynamically resolve a long name to a short name:

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

Then, obviously you can use the short name rather than surrounding quotes.

BuvinJ
  • 311
-1

You can also try

c:\'Documents and Settings'\username\'some space here'\svn\*.*

i.e. surround all folder names that contain spaces with single quotes (').

Kjara
  • 99