В Windows x64 есть не только 1 %SystemRoot%\System32
. Таких каталогов 2.
Настоящая директория %SystemRoot%\System32
предназначена для 64-битных приложений. Этот каталог содержит 64-битный файл cmd.exe
.
Но есть еще %SystemRoot%\SysWOW64
для 32-битных приложений. Этот каталог используется, если 32-разрядное приложение обращается к %SystemRoot%\System32
. Он содержит 32-битный cmd.exe
.
32-разрядные приложения могут обращаться к %SystemRoot%\System32
для 64-разрядных приложений, используя псевдоним %SystemRoot%\Sysnative
в пути.
Дополнительные сведения см. В документации Microsoft о перенаправителе файловой системы < / а>.
Таким образом, подкаталог run
был создан либо в %SystemRoot%\System32
для 64-разрядных приложений, и запущен 32-разрядный cmd
, для которого этот каталог не существует, потому что нет подкаталога run
в %SystemRoot%\SysWOW64
, который %SystemRoot%\System32
для 32-разрядных cmd.exe
или strong> подкаталог run
был создан в %SystemRoot%\System32
для 32-разрядных приложений и запущен 64-разрядный cmd
, для которого этот каталог не существует, потому что в %SystemRoot%\System32
нет подкаталога run
, поскольку этот подкаталог существует только в %SystemRoot%\SysWOW64
.
Следующий код можно использовать в верхней части командного файла, если подкаталог run
находится в %SystemRoot%\System32
для 64-разрядных приложений:
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%" == "" if exist %SystemRoot%\Sysnative\* set "SystemPath=%SystemRoot%\Sysnative"
Каждое консольное приложение в System32\run
каталоге должно выполняться с %SystemPath%
в пакетном файле, например %SystemPath%\run\YourApp.exe
.
Как это работает?
В Windows x86 нет переменной среды ProgramFiles (x86), поэтому на самом деле существует только один %SystemRoot%\System32
, как определено вверху.
Но есть переменная среды ProgramFiles (x86) со значением в Windows x64. Так что в Windows x64 дополнительно проверяется наличие файлов в %SystemRoot%\Sysnative
. В этом случае командный файл в настоящее время обрабатывается 32-битным cmd.exe
, и только в этом случае %SystemRoot%\Sysnative
нужно вообще использовать. В противном случае %SystemRoot%\System32
можно использовать также в Windows x64, поскольку, когда пакетный файл обрабатывается 64-битной cmd.exe
, это каталог, содержащий 64-битные консольные приложения (и подкаталог run
).
Примечание. %SystemRoot%\Sysnative
- это не каталог! Невозможно cd
на %SystemRoot%\Sysnative
или использовать if exist %SystemRoot%\Sysnative
или if exist %SystemRoot%\Sysnative\
. Это специальный псевдоним, существующий только для 32-битных исполняемых файлов, и поэтому необходимо проверить, существует ли один или несколько файлов при использовании этого пути, используя if exist %SystemRoot%\Sysnative\cmd.exe
или более общий if exist %SystemRoot%\Sysnative\*
.
person
Mofi
schedule
12.11.2015