我有 BAT 脚本,有时会在自己的计算机上从 64 位 cmd.exe 运行,而且它还必须在 32 位进程的构建服务器上正常工作。问题是脚本需要引用 64 位文件夹C:\Windows\System32
。而 32 位进程将其映射到C:\Windows\SysWOW64
。
有虚拟Sysnative 文件夹,但是对于 64 位进程它并不存在(这太简单了)。
除此之外还有其他方法可以解决这个问题吗if exist "%systemroot%\Sysnative" (...) else (...)
?
PS 所有主机都是64位系统,无需考虑32位Windows安装的可能性。
PS #2:尽管类似命令按预期工作,if exist "%systemroot%\Sysnative"
但总是采用错误分支。微软干得好。dir "%systemroot%\Sysnative"
答案1
如果我理解你的问题的话,无论过程如何,你总是希望获得 System32。
您可以直接使用%SystemRoot%\System32
。
编辑:正如您所提到的,存在一个透明的重定向,我认为没有办法在批处理文件中绕过它。
如果你正在编写本机应用程序,则可以使用wow64禁用wow64fs重定向。
无论如何,在这种情况下,最简单的方法是编写 if 语句。
编辑 2:if exist
目录末尾需要斜杠。如果您使用if exist "%systemroot%\Sysnative\" ...
答案2
如果您需要在批处理文件中找出它是在 32 位还是 64 位模式下运行,您可以测试 PROCESSOR_ARCHITECTURE 环境变量的值:
64位进程架构:
PROCESSOR_ARCHITECTURE=AMD64
32位进程架构:
PROCESSOR_ARCHITECTURE=x86
请注意,如果您希望在 64 位 Windows 中测试 32 位 CMD,请运行%windir%\SysWoW64\cmd.exe
而不是cmd.exe
。
答案3
除了
if exist "%systemroot%\Sysnative" (...) else (...)
?
...
有没有简单的方法可以统一获取64位System32的路径?尝试:
导致窗口 32:
echo;"%ComSpec:SysWOW64=System32%" // "C:\Windows\System32\cmd.exe" echo;"%ComSpec:SysWOW64\cmd.exe=System32%" // "C:\Windows\System32" echo;"%__AppDir__:SysWOW64=System32%" // "C:\Windows\System32\"
导致窗口 64:
echo;"%ComSpec:SysWOW64=System32%" // "C:\Windows\System32\cmd.exe" echo;"%ComSpec:SysWOW64\cmd.exe=System32%" // "C:\Windows\System32" echo;"%__AppDir__:SysWOW64=System32%" // "C:\Windows\System32\"
观察:我也不明白目标是否始终是在 64 位系统上以 64 位模式运行应用程序,或者即使在 64 位系统上也以 32 位模式运行......
@echo off
echo\ %__AppDir__% | find "SysWOW64" 1>nul || (
start "" /b "%ComSpec:System32=SysWOW64%" /k "%~f0"
type "%temp%\test.txt"
exit /b
)
echo\ %__AppDir__% >"%temp%\test.txt"
rem Your Commands
rem Your Commands
rem Your Commands
文件中的结果"%temp%\test.txt"
:
C:\Windows\SysWOW64\
@echo off
for %%i in (msvcp140,msvcp140_1,vcruntime140,vcruntime140_1)do 1>nul 2>nul =;(
"%ComSpec:System32=SysWOW64%" /v /c "xcopy /R /Y "%__AppDir__:System32\=SysWOW64%\%%~i.dll" .\binaries\32\msvcr\"
);= || goto :dll_not_found
exit /b
:dll_not_found
echo\here im :dll_not_found
命令结果:
"C:\Windows\SysWOW64\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\SysWOW64\msvcp140.dll" .\binaries\32\msvcr\"
"C:\Windows\SysWOW64\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\SysWOW64\msvcp140_1.dll" .\binaries\32\msvcr\"
"C:\Windows\SysWOW64\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\SysWOW64\vcruntime140.dll" .\binaries\32\msvcr\"
"C:\Windows\SysWOW64\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\SysWOW64\vcruntime140_1.dll" .\binaries\32\msvcr\"
@echo off
for %%i in (msvcp140,msvcp140_1,vcruntime140,vcruntime140_1)do 1>nul 2>nul =;(
"%ComSpec:SysWOW64=System32%" /v /c "xcopy /R /Y "%__AppDir__:SysWOW64\=System32%\%%~i.dll" .\binaries\32\msvcr\"
);= || goto :dll_not_found
exit /b
:dll_not_found
echo\here im :dll_not_found
命令结果:
"C:\Windows\system32\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\System32\\msvcp140.dll" .\binaries\32\msvcr\"
"C:\Windows\system32\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\System32\\msvcp140_1.dll" .\binaries\32\msvcr\"
"C:\Windows\system32\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\System32\\vcruntime140.dll" .\binaries\32\msvcr\"
"C:\Windows\system32\cmd.exe" /v /c "xcopy /R /Y "C:\Windows\System32\\vcruntime140_1.dll" .\binaries\32\msvcr\"