I recommend first reading the answers on Stack Overflow questions:
Many thanks to eryksun because of this answer would not exist without his comment on above referenced answer.
Next I recommend reading the Microsoft Developer Network (MSDN) articles:
The question can be answered with: Yes, it is possible for desktop applications and batch files on
- Windows Vista and all later Windows client versions and
- Windows Server 2003 and all later Windows Server versions.
An environment variable with name NoDefaultCurrentDirectoryInExePath
must be defined with any value to prevent execution of a script (.bat, .cmd, .vbs, ...) or an application (.com, .exe) stored in current directory without explicitly using .\
as required on Unix/Linux.
The environment variable NoDefaultCurrentDirectoryInExePath
can be defined as system variable to turn off searching in current directory for a script or application for all accounts on this machine. But this is surely no good idea as it will result definitely in many applications including installers and uninstallers won't work anymore correct.
The environment variable NoDefaultCurrentDirectoryInExePath
can be defined as user variable to turn off searching in current directory for a script or application for processes using this account. But this is surely also no good idea.
But it can make sense to set the environment variable NoDefaultCurrentDirectoryInExePath
as local variable in some use cases to turn off searching in current directory for a script or application without explicitly using .\
on Windows versions with kernel function NeedCurrentDirectoryForExePath
which cmd.exe
calls before searching for a script file or application not containing a backslash \
(or a forward slash /
) in file name string.
Example:
@echo off
pushd "%TEMP%"
set "NoDefaultCurrentDirectoryInExePath=0"
echo @echo %%0 executed successfully.>Test1.bat
echo Calling Test1.bat ...
call Test1.bat
echo Calling .\Test1.bat ...
call .\Test1.bat
echo Starting Test1.bat ...
start /wait Test1.bat ^& timeout 5
set "NoDefaultCurrentDirectoryInExePath="
echo Calling again Test1.bat ...
call Test1.bat
del Test1.bat
popd
pause
This batch file executed from within a command prompt window results in output of current console window:
Calling Test1.bat ...
'Test1.bat' is not recognized as an internal or external command,
operable program or batch file.
Calling .\Test1.bat ...
.\Test1.bat executed successfully.
Starting Test1.bat ...
Calling again Test1.bat ...
Test1.bat executed successfully.
Press any key to continue . . .
And during execution of this batch file a second console window is opened with output:
"%TEMP%\Test1.bat" executed successfully.
This second console window is closed automatically after 5 seconds.
The environment variable NoDefaultCurrentDirectoryInExePath
is defined with value 0
after setting directory for temporary files as current directory with pushing current directory path on stack. The variable value does not matter because of evaluated is only existence of environment variable and not its value.
Next another batch file with name Test1.bat
is created in directory for temporary files which is usually not write-protected for current user as this would cause lots of troubles.
The first approach to call Test1.bat
without any path fails because of environment variable NoDefaultCurrentDirectoryInExePath
is defined in local environment.
The second call of Test1.bat
with relative path .\
is successful despite existence of the environment variable.
The command START ignores NoDefaultCurrentDirectoryInExePath
as proven by this batch file.
Then the environment variable NoDefaultCurrentDirectoryInExePath
is deleted to restore original Windows behavior.
The second approach to call Test1.bat
without any path is successful now.
Finally the created Test1.bat
is deleted and initial current directory is restored as current directory.
It is of course not possible to prevent execution of command DIR which is not a script file or an executable. It is an internal command of cmd.exe
– Windows Command Processor – respectively of powershell.exe
– Windows PowerShell.