【问题标题】:How to create a batch file which work for both Program Files and Program Files(x86)?如何创建适用于 Program Files 和 Program Files(x86) 的批处理文件?
【发布时间】:2012-04-21 17:07:18
【问题描述】:

我创建了一个批处理文件,它会自动将 .sql 文件复制到已安装的 Jasper 服务器的路径(可以是任何软件安装目录)。

这是我的批处理脚本--

C:\PROGRA~2\JASPER~1.0\mysql\bin\mysql.exe -u root -proot

当 jasper 安装在 Program Files(x86) 中时,它可以工作。 我如何将它概括为 Program Files 和 Program Files(x86)。

【问题讨论】:

  • “Archivos de programa”怎么样?
  • C:\PROGRA~2 可以是任何文件夹,您对最终用户机器上的 8.3 名称生成一无所知...
  • 我现在找不到任何备份它的东西,但我很确定 C:\PROGRA~1 总是指向 C:\Program Files 文件夹,因为以及以下..C:\PROGRA~1 == C:\Program FilesC:\PROGRA~2 == C:\Program Files (x86)C:\PROGRA~3 == C:\ProgramDataC:\DOCUME~1 == C:\Documents and SettingsC:\SYSTEM~1 == C:\System Volume Information..虽然我可能是错的..

标签: batch-file 32bit-64bit nsis batch-processing


【解决方案1】:

这是我从这个来源复制的一种方法: http://social.msdn.microsoft.com/Forums/zh/winforms/thread/69dc2aac-9956-40a0-9826-da48b9003a8e

SET ProgFiles86Root=%ProgramFiles(x86)%
IF NOT "%ProgFiles86Root%"=="" GOTO win64
SET ProgFiles86Root=%ProgramFiles%
:win64

"%ProgFiles86Root%\name of program" "arguments, etc."

【讨论】:

  • 我相信这将是一个“更正确”的答案,因为我尝试使用 %ProgramFiles%%%ProgramFiles(x86)% 使用“IF EXISTS”语句,但它无法正常运行。这解决了这个问题,因为它确定了哪个目录可用,并使用正确的文件路径执行了程序。然而,被接受为答案的另一种方法不够“聪明”,无法确定是否存在 x86 或 x64 系统。非常感谢您。
【解决方案2】:

您想使用环境变量来查找此类内容。在 32 位 Windows 上,%ProgramFiles% 是您的朋友。

在 64 位 Windows 上,事情有点复杂,因为应用程序可以安装在 %ProgramFiles%%ProgramFiles(x86)% 中。

如果您无法通过其他方式查找 Jasper 的位置(注册表?已安装的程序设置?),您最好的办法是同时查看这两个位置,然后选择您可以找到预期目录的位置。

编辑 看到 nsis 标签 - 你在创建安装程序吗?在这种情况下,常量$ProgramFiles 可能有用。

【讨论】:

  • 是的,我正在使用 NSIS 脚本创建安装程序,如何为 NSIS 编写上述脚本。
  • 如果我使用 $ProgramFiles,它只会搜索 Program Files 目录,如果我的 Jasper 目录位于 Program Files(x86) 目录中,则它不起作用。
【解决方案3】:

在 NSIS 中,您通常可以假装 x64 不存在并使用 $programfiles

在批处理文件中;如果定义了%ProgramFiles(x86)%,那么您可以假设您使用的是 64 位系统,并且 %ProgramFiles(x86)% 是 32 位文件夹,而 %ProgramFiles% 是 64 位文件夹。您还可以检查 PROCESSOR_*: PROCESSOR_ARCHITEW6432 是为在 64 位系统上运行的 32 位批处理文件定义的。 PROCESSOR_ARCHITECTURE 是 x86-64/AMD64 位批处理文件的 AMD64(请记住,PROCESSOR_ARCHITECTURE 不仅仅是 x86 或 AMD64,还有 IA64 和 NT4 甚至更多值)

您还应该记住,变量可以由用户更改或可能根本不存在,因此如果您使用 NSIS 生成批次,最好使用 NSIS 提供的完整路径...

【讨论】:

  • 如何解决 UAC 问题,因为我创建的 exe 可以在某些系统上运行,而不适用于所有系统?
  • 实际上我创建的安装程序并不适用于所有系统。它给出了权限错误。
  • 是的,我正在使用管理员帐户安装此安装程序,当我安装任何其他软件时,它会询问您是否要安装它的权限,但对于我的安装程序,它不会询问任何事情获得许可并在不安装我的软件的情况下完成安装。
【解决方案4】:

像这样简单的东西怎么样,

if exist "C:\Program Files (x86)" goto 64bit

goto 32bit

:32bit

(whatever u want to happen for the 32bit system)

:64bit

(whatever u want to happen for the 64bit system)

我有一个像这样设置的脚本,并且对两个系统都适用。

对不起,它不想保持格式正确的双倍行距。

【讨论】:

    【解决方案5】:

    这是我的做法:

    GOTO %PROCESSOR_ARCHITECTURE%
    
    :AMD64
    <64Bit code>
    EXIT
    
    :X86
    <32bit code>
    EXIT
    

    【讨论】:

      【解决方案6】:

      似乎@RenniePet 的答案很好。对于另一种选择,这是我做的方式。从here 的答案(主要来自@Samuel 的答案)中都没有太高效和抄袭。使用此解决方案,仅依赖目录结构:没有参考环境变量。

      @echo off
      dir "C:\Program Files (x86)\\." > NUL 2>&1
      if errorlevel 0 (
          set PROGRAMS_HOME="C:\Program Files (x86)"
          GOTO HomeSet
      )
      dir "C:\Program Files\\." > NUL 2>&1
      if errorlevel 0 (
          set PROGRAMS_HOME="C:\Program Files"
          GOTO HomeSet
      )   
      GOTO NotWindows
      :HomeSet
      set PROGRAMS_HOME=%PROGRAMS_HOME:"=%
      echo PROGRAMS_HOME set to *%PROGRAMS_HOME%*
      :NotWindows
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        相关资源
        最近更新 更多