I need to call a batch file with a command I want it to execute. This command contains the %cd% pseudo-variable, which expands to the current directory. Say, I want to run test "echo %cd%". The problem is that %cd% expands before test is called.

Normally, you can escape a variable by doubling the percent signs, but this does not seem to apply to pseudo-variables. For instance, echo %%ProgramFiles%% will print %ProgramFiles%, but echo %%errorlevel%% will print %0%. What do I do?

2 Answers 2


The general-purpose escape character in Windows Command Prompt — the analog of \ in the rest of the universe — is caret (^).  Try “^%cd^%”.


… and then,

echo %1 > temp.bat
call temp.bat
del temp.bat

Yes, it’s terribly ugly, and there really ought to be a better way.  Well, I can’t find it.

  • Ah, but now test "echo ^%cd^%" prints %cd% instead of the current directory. What I need is for the pseudo-variable to be preserved when I pass it to the script, but expanded inside.
    – Don Reba
    Commented Dec 4, 2012 at 1:27
  • OK, I’ve edited my answer to address that problem. Commented Dec 4, 2012 at 3:18

I'm not having much luck without getting CALL involved, either. With this test.bat:


invoking test.bat call echo ^%cd^% works as expected. Or, putting the CALL inside test.bat:

@CALL %*

and invoking test.bat echo ^%cd^% works. (This is safer anyhow, since if test.bat is getting called from another script, then passing a script to it won't run the risk of exiting prematurely.)

I suppose which works better for you (or if either can be made to work at all) depends on the specifics of your scenario.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .