Why is Windows Vista 64-bit using a 32-bit cmd.exe by default? (machine-specific)
-
22-08-2019 - |
Question
The situation:
I need to convert our current development environment from Windows XP 32-bit to Windows Vista 64-bit (*). Naturally, I've run into plenty of places in our build system where hardcoded paths were problematic (e.g. "C:\Program Files
" becoming "C:\Program Files (x86)
"). Fortunately, there is a %ProgramFiles%
environment variable which maps to the proper directory based on the source process (32-bit or 64-bit). So I updated the build scripts with %ProgramFiles%
, and I was sure it'd be the end of that.
The build environment is called from the command-line (C:\Windows\System32\cmd.exe
).
The problem:
On one specific machine (namely my dev machine at work), it turns out that C:\Windows\System32\cmd.exe
is actually a 32bit process, so the scripts find the x86
version of the Program Files
directory and everything works great.
On every other 64bit machine I can find (including my home machine), C:\Windows\System32\cmd.exe
is the 64bit version, and the 32bit version is in C:\Windows\SysWow64\cmd.exe
. So the build scripts can't find anything they're looking for and fail.
I understand now that the 32bit cmd.exe
should be called explicitly if that's what you need, and by default you get a 64bit cmd.exe
. Typical case of WORKSFORME
...
The question is, what happened to the machine where this is not true? Why am I getting a 32bit cmd.exe
by default on one machine but not on others? In all cases I am explicitly executing C:\Windows\System32\cmd.exe
from the Start|Run
menu but getting different results on one machine only. All are running the same edition of Vista 64bit.
Any thoughts or insight?
(*) Please accept that I must do this. I am not at liberty to say why I am doing this. Re-installing the OS and everything from scratch would probably work, but it is surely overkill. Besides, it was hard enough convincing our IT department to give out Vista machines!
Solution 2
I have finally found the problem, and as expected it is quite simple: user error. Explorer (which is itself a 64-bit process on Windows Vista 64-bit) launches 64-bit command prompts by default. If you want a 32-bit CMD.EXE
, you must explicitly reference C:\Windows\SysWoW64\CMD.EXE
.
The reason this worked fine on my system is that I use Far Manager for most of my command-line usage, which is 32-bit (therefore it launches 32-bit command prompts). When I verified I must have confused a 32-bit window for a 64-bit window (after all they look the same!) and asked a stupid question.
Die in Sente, the problem with %ProgramFiles(x86)%
is that it doesn't exist on Windows Vista 32-bit, because that would have really been simpler.
Ah, there is nothing like a public posting to make a fool of yourself... :)
OTHER TIPS
If you ran cmd from a 32-bit process, you'd get the 32-bit cmd because of File Redirection (http://msdn.microsoft.com/en-us/library/aa384187.aspx). Do you get the 32-bit version of CMD when you run it from Explorer?
cmd.exe
is launched from within the Start menu on both machines. Exact repro:
- Click the Start Orb
- Type "
cmd
", only one match comes up (c:\windows\system32\cmd.exe
) - Launch it.
On my work machine, it launches the 32bit version (as demonstrated by the Task Manager, it has *32
appended to the name in the Processes
tab). On all other Vista 64 machines I've tried, this launches the 64bit version of cmd
, and I cannot find a rational explanation for this behavior.
I haven't checked if explorer.exe
itself was 32bit or 64bit on the affected machine, maybe this is related... Thanks for the hint.
Instead of %ProgramFiles%
, isn't there a %Programfiles(x86)%
that always goes where you want, regardless of which cmd.exe is running? My Windows XP 64-bit systems all have that; excuse me for not taking the time to boot up a Vista system.