首页 > 解决方案 > 推送批处理文件意外行为

问题描述

我正在从 2 个批处理文件中安装 3 个 msi 文件。第一个批处理文件找到 msi 位置并将日志写入我想要的位置

pushd %~dp0..\%VERSION%\MSIFOLDER\
msiexec /i "InstallMe.msi" /qn TARGETDIR="%x32%" TARGET64DIR="%x64%" /L*v "%~dp0Scripts\Logs\InstallMe.log"
msiexec /i "InstallMe2.msi" /qn TARGETDIR="%x32%" TARGET64DIR="%x64%" /L*v "%~dp0Scripts\Logs\InstallMe2.log"
popd

第二个批处理文件找到 msi 位置(与 batch1 相同)并将日志写入我想要的位置(与 batch1 相同的位置)

pushd %~dp0..\%VERSION%\MSIFOLDER\
msiexec /i "InstallMe3.msi" /qn TARGETDIR="%Target_PATH%\InstallMe3" /L*v "%~dp0..\..\BatchFileFolder\Scripts\Logs\InstallMe3.log"
popd

但是,请注意批处理 1 和批处理 2 的日志文件的不同路径

似乎在 batch1 中的 pushd 没有将我推入的路径设置为当前工作目录,因为日志%~dp0仍然指向批处理文件所在的位置

在 batch2 中,它按我的预期工作......我真的很困惑,基本上相同的命令有不同的行为,并且无法找出导致它的原因。

SETLOCAL EnableDelayedExpansion在我拥有的两个文件之上
SETLOCAL EnableExtensions

另一件值得一提的是,如果从 1 个批次调用 3 个 MSI,则 pushd 的行为正确,即在将日志文件写入/L*v "%~dp0..\..\BatchFileFolder\Scripts\Logs\InstallMe3.log"路径时作为 batch2。但是当我将那些 3 分 2 的批处理文件分开时......它们的行为会有所不同吗?!

重要提示:我使用 pushd 的原因是,我无法安装msi具有相对路径的文件。

任何想法和帮助将不胜感激。

|
+   ContainerDir
|   +---MSIFilesRootDir [%VERSION%]
|   |   +---MSIFilesDir [%~dp0..\%VERSION%\MSIFilesDir]
|   |       InstallMe1.msi
|   |       InstallMe2.msi
|   |       InstallMe3.msi
|   |
|   +---BatchFileFolder [%~dp0]
|   |     BatchFile.bat
|   |   \---Scripts [%~dp0Scripts]
|   |       \---Logs [%~dp0Scripts\Logs]
|   |           InstallMe1.log
|   |           InstallMe2.log
|   |           InstallMe3.log
|   |

这是文件夹和文件结构

标签: batch-filewindows-installer

解决方案


这是否使您能够可视化事物?我在方括号内添加了一些信息以提供帮助

|
\---SomeDir [%~dp0..\..]
    +---ContainerDir [%~dp0..]
    |   +---MSIFilesRootDir  [%~dp0..\%VERSION%]
    |   |   \---MSIFilesDir [%~dp0..\%VERSION%\MSIFilesDir]
    |   |           InstallMe.msi [%~dp0..\%VERSION%\MSIFilesDir\InstallMe.msi]
    |   |           InstallMe2.msi [%~dp0..\%VERSION%\MSIFilesDir\InstallMe2.msi]
    |   |           InstallMe3.msi [%~dp0..\%VERSION%\MSIFilesDir\InstallMe3.msi]
    |   |           
    |   \---BatchDir [%~dp0]
    |       |   BatchFile.bat [%0]
    |       |       
    |       \---Scripts [%~dp0Scripts]
    |           \---Logs [%~dp0Scripts\Logs]
    |                   InstallMe.log [%~dp0Scripts\Logs\InstallMe.log]
    |                   InstallMe2.log [%~dp0Scripts\Logs\InstallMe2.log]
    |                   
    \---BatchFileFolder [%~dp0..\..\BatchFileFolder]
        \---Scripts [%~dp0..\..\BatchFileFolder\Scripts]
            \---Logs [%~dp0..\..\BatchFileFolder\Scripts\Logs]
                    InstallMe3.log [%~dp0..\..\BatchFileFolder\Scripts\Logs\InstallMe3.log]

您可以使用Tree选项/A/F,创建类似的内容Tree /?在命令提示符处输入使用信息)


推荐阅读