有没有简单的方法可以统一获取64位System32的路径?

有没有简单的方法可以统一获取64位System32的路径?

我有 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\"


相关内容