delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2006/10/13/09:05:41

X-Spam-Check-By: sourceware.org
MIME-Version: 1.0
Subject: RE: Bash fails to run .bat file with spaces in pathname and argument
Date: Fri, 13 Oct 2006 09:05:15 -0400
Message-ID: <31DDB7BE4BF41D4888D41709C476B65704169190@NIHCESMLBX5.nih.gov>
In-Reply-To: <31DDB7BE4BF41D4888D41709C476B6570416918D@NIHCESMLBX5.nih.gov>
From: "Buchbinder, Barry \(NIH/NIAID\) [E]" <BBuchbinder AT niaid DOT nih DOT gov>
To: <cygwin AT cygwin DOT com>
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT cygwin DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Note-from-DJ: This may be spam
X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id k9DD5YCd030072

Buchbinder, Barry (NIH/NIAID) wrote:
> * Johnathon Jamison (Wed, 11 Oct 2006 14:11:12 -0700)
>> I am having some funny behavior.  If I have a .bat file that is in a
>> directory whose pathname contains a space, and an argument is given
>> to the .bat file that has a space in it, then the .bat file fails to
>> run. Instead, I get "'xxx' is not recognized as an internal or
>> external command, operable program or batch file." where xxx is the
>> portion of the complete path to the .bat file before the first space.
>> 
>> I am not sure why this is occurring.  Any help would be appreciated.
>> I have more specific information and a sample run below.  If I have
>> left anything out, just ask.  In particular, I am not sure which
>> version numbers would be needed, or where to find (many of) them.
> 
> The problem is, at least in part, with cmd.  cmd /? says:
> 
>   If /C or /K is specified, then the remainder of the command line
>   after the switch is processed as a command line, where the
>   following logic is used to process quote (") characters:
> 
>       1.  If all of the following conditions are met, then quote
>           characters on the command line are preserved:
> 
>           - no /S switch
>           - exactly two quote characters
>           - no special characters between the two quote characters,
>             where special is one of: &<>()@^|
>           - there are one or more whitespace characters between the
>             the two quote characters
>           - the string between the two quote characters is the name
>             of an executable file.
> 
>       2.  Otherwise, old behavior is to see if the first character is
>           a quote character and if so, strip the leading character and
>           remove the last quote character on the command line,
>           preserving any text after the last quote character.

> Try using short names to get rid of the first set of quotes.  Short
>   names still work, at least on XP.  Compare c:\>dir docume~1
> and
>   c:\>dir "Documents and Settings"
> 
> To find out the short names,
>   c:\>dir /x
> Or one can guess (first 6 characters + "~" + "1", or a higher digit
> if the 6 characters + "~1" is already used, + "." + first 3
> characters of the extension).  
> 
> Try changing the batch file from
>   echo %1
> to
>   echo %1 %2 %3 %4 %5 %6 %7 %8 %9
> That should work by getting rid of the second set of quotes, at least
> if the number of arguments is less than 10. 
> 
> This, also, works
> 
>   /c> echo '"c:\Documents and Settings\BBuchbinder\test.bat" "hello
>   world" exit' | u2d | cmd /k
>   c:\>"c:\Documents and Settings\BBuchbinder\test.bat" "hello world"
> 
>   c:\>echo "hello world"
>   "hello world"
> 
>   c:\>exit
> 
> You can leave off the "/k", but you then get extraneous text from
> cmd.exe as it loads.

I forgot to include cd-ing into the directory with spaces, though it
does not work as I would expect

  /c> cd '/c/Documents and Settings'
  /c/Documents and Settings/BBuchbinder> cmd /c test Hello World

  c:\Documents and Settings\BBuchbinder>echo Hello
  Hello 

That was expected; the following is not.

  /c/Documents and Settings/BBuchbinder> cmd /c test "Hello World"

  c:\Documents and Settings\BBuchbinder>echo "Hello World"
  "Hello World"

Shouldn't the double quotes be stripped off before cmd sees them?

  /c/Documents and Settings/BBuchbinder> cmd /c test '"Hello World"'

  c:\Documents and Settings\BBuchbinder>echo "\"Hello
  "\"Hello

Why is the backslash being inserted to quote the second double quote and
why is the single quote being changed into a double quote?  (Not that I
really care.)

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019