On 2006-10-28, Buchbinder, Barry (NIH/NIAID) [E] wrote: > From: Gary Johnson; Sent: Friday, October 27, 2006 11:44 PM > > I am trying to pass Windows path names from a Windows batch file > > to a Cygwin bash script. I have found a solution using Windows > > environment variable substitution to replace \s with /s before > > passing the name to bash, but I cannot figure out how to pass > > the name without that replacement. The problem is with names of > > the form > > > > "\\host\user\file with spaces" > > > > No matter what I've tried, bash insists on collapsing the two > > leading \s to one, like this, > > > > \host\user\file with spaces > > > > before anything else can be done with the name.
[...] > It is not clear to me that bash is doing this, since cygpath behaves > identically when run from cmd.exe (XPpro). > > c:\>cygpath -u "\\host\user\file with spaces" > /c/host/user/file with spaces > > c:\>cygpath -u '\\host\user\file with spaces' > /c/host/user/file with spaces Good observation. Thanks. That does remove bash from the picture. The results from executing those same commands from the bash prompt are oddly different, though (ignoring the "/cygdrive" directory, of course). $ cygpath -u "\\host\user\file with spaces" /cygdrive/c/host/user/file with spaces $ cygpath -u '\\host\user\file with spaces' //host/user/file with spaces $ cygpath -u '"\\host\user\file with spaces"' "//host/user/file with spaces" > If you know that your batch file will always be feeding something > starting with \\host to bash, you could add and extra pair of back > slashes. > > c:\>cygpath -u '\\\\host\user\file with spaces' > //host/user/file with spaces > > c:\>cygpath -u "\\\\host\user\file with spaces" > //host/user/file with spaces The batch file is called from Windows, so I don't have any control over the path name string. I think there are only four cases, though: 1. C:\directory\file_without_spaces 2. "C:\directory\file with spaces" 3. \\host\user\file_without_spaces 4. "\\host\user\file with spaces" The drive letter could be different, but the format would be the same. So I think it would be sufficient to test the path in the bash script for a leading backslash and if present, double it. > It looks like if you can use single quotes in bash, it works OK. > > /c> p='\\host\user\file with spaces' ; cygpath -u $p ; cygpath > "$p" > //host/user/file > with > spaces > //host/user/file with spaces Yes, but I have the path as a shell parameter, not as a literal string, so I have to expand the parameter without expanding the backslashes, and expanding the parameter can't be done within single quotes. > You might consider dumping it into a file and the converting by hand in > your script. > > Batch: > c:\>echo "\\host\user\file with spaces" > c:\cygwin\tmp\ttt > > Script: > foo "$(sed -e 's,\\,/,g' -e 's/" *//g' /tmp/ttt)" > rm /tmp/ttt > > Note, I have only partly tested it so you might have to play with it a > bit more before it works. Wow, that does work! Batch (foo.bat): @echo off echo %1 > mypath.txt C:\cygwin\bin\bash bar Script (bar): path=$(< mypath.txt) echo $path /bin/cygpath -u "$path" Command: foo "\\host\user\file with spaces" Output: "\\host\user\file with spaces" "//host/user/file with spaces" It's such a pity to have to use a temporary file to pass a simple parameter, though. The solution I've been using so far is to put this in the batch file: SET arg=%1 C:\cygwin\bin\bash --login -c 'bash_script %arg:\=/%' This replaces all the backslashes in arg with forward slashes before arg is given to bash. (I just stumbled upon that in my desperate reading of Windows help commands. I know next to nothing about batch file programming.) I sure wish I knew why it was doing this, but at least I have some alternative solutions to consider. Thanks again. Regards, Gary -- Gary Johnson | Agilent Technologies [EMAIL PROTECTED] | Wireless Division | Spokane, Washington, USA -- 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/