Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call .exe from batch file with variable path containing spaces

I want to launch a windows executable from a batch file where the path to the executable is stored in a variable.

@echo off

set qtpath=C:\Program Files\Qt\5.7\mingw53_32\bin
set execpath=%qtpath%\windeployqt.exe

echo %execpath%

%execpath% --someparams

Unfortunately executing my script throws an error:

'C:\Program' is not recognized as an internal or external command, operable program or batch file.

Looks like somehow the string gets terminated at the space in Program Files.

like image 444
strnmn Avatar asked Aug 23 '16 12:08

strnmn


People also ask

How do you pass a path with spaces in CMD?

Use quotation marks when specifying long filenames or paths with spaces. For example, typing the copy c:\my file name d:\my new file name command at the command prompt results in the following error message: The system cannot find the file specified. The quotation marks must be used.

Can PATH variable have spaces?

Most programs separate their command line arguments with a space. But the PATH environment variable doesn't use spaces to separate directories. It uses semicolons.

How do I echo space in a batch file?

To create a blank line in a batch file, add an open bracket or period immediately after the echo command with no space, as shown below. Adding @echo off at the beginning of the batch file turns off the echo and does not show each of the commands. @echo off echo There will be a blank line below. echo.

What does %% mean in batch file?

Represents a replaceable parameter. Use a single percent sign ( % ) to carry out the for command at the command prompt. Use double percent signs ( %% ) to carry out the for command within a batch file. Variables are case sensitive, and they must be represented with an alphabetical value such as %a, %b, or %c. ( <set> )


2 Answers

You should change your code to this:

@echo off

set "qtpath=C:\Program Files\Qt\5.7\mingw53_32\bin"
set "execpath=%qtpath%\windeployqt.exe"

echo "%execpath%"

"%execpath%" --someparams

The SPACE, like also TAB, ,, ;, =, VTAB (vertical tabulator, ASCII 0x0B), FF (form-feed, ASCII 0x0C) and NBSP (non-break space, ASCII 0xFF) constitute token separators in the command prompt cmd. To escape tokenisation enclose your path in between "". This avoids also trouble with special characters like ^, ( and ), &, <, > and |.

The quotation marks in the set command lines again avoid trouble with special characters; they do not become part of the variable value because they enclose the entire assignment expression. Note that this syntax requires the command extensions to be enabled, but this is the default anyway.

I recommend not to include the quotation marks into variable values (set VAR="some value"), because then you could run into problems particularly when concatenating strings due to unwanted (double-)quotation (for instance, echo "C:\%VAR%\file.txt" returns "C:\"some value"\file.txt").

like image 81
aschipfl Avatar answered Oct 18 '22 21:10

aschipfl


You are perfectly right. If the path to the file you want to execute contains spaces, you have to surround it with quotation marks:

@echo off

set qtpath=C:\Program Files\Qt\5.7\mingw53_32\bin
set execpath="%qtpath%\windeployqt.exe"

echo %execpath%

%execpath% --someparams

This should work.

It will also work when you surround %execpath% with quotation marks:

"%execpath%" --someparams
like image 25
MichaelS Avatar answered Oct 18 '22 21:10

MichaelS