【问题标题】:pushd in batch file unexpected behavior推送批处理文件意外行为
【发布时间】:2019-01-03 06:20:32
【问题描述】:

我正在从 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

但是,请注意 batch1 和 batch2 的日志文件路径不同

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

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

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

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

重要提示:我使用 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
|   |

这是文件夹和文件结构

【问题讨论】:

  • 您尝试过%~dp0..\..\BatchFileFolder\Scripts\Logs\InstallMe1.log (and 2) 的batch1 吗?您似乎希望将 3 个日志放在同一目录中。但同时您对 batch1 和 batch2 使用不同的目录路径
  • 那么,你确定%~dp0Scripts\Logs%~dp0..\..\BatchFileFolder\Scripts\Logs 相等吗?可能你可以pushd "%~dp0Scripts\Logs\" ///// echo %CD%pushd "%~dp0..\..\BatchFileFolder\Scripts\Logs\" ///// echo %CD%(注意 //// => 换行)看看绝对路径是否相等。
  • 为什么你认为这是PUSHD的错?您看到的行为是完全可以预料的。 %~dp0Scripts\Logs 指向您的批处理文件所在的子目录Scripts\Logs。我想你把%~dp0 和当前目录混淆了,它是当前正在执行的批处理文件的路径,不会因为改变目录而改变
  • 另请参阅What is the reason for batch file path referenced with %~dp0 sometimes changes on changing directory? 以及应用程序/脚本目录与当前目录之间的区别,例如在How to run tree command from current directory? 上的回答中解释了@ BTW:您可以使用FOR获得绝对路径b>,例如for %%I in ("%~dp0..\%VERSION%\MSIFOLDER") do set "FolderMSI=%%~fI" 分配给环境变量FolderMSI MSI 文件夹的绝对路径。
  • 你说:I expect %~dp0 to be the path i pushd to。事实并非如此。您刚刚确认了混淆的来源,实际上%~dp0 必须始终指向批处理文件的目录,因此,如果您观察到除此之外的行为,那么是batch2 没有按预期工作而不是batch1。在这种情况下,您可能会受到 Mofi 发布的错误的影响。但我不确定该错误是否适用于您的情况,因为我们不知道您的批处理文件的目录结构。

标签: batch-file windows-installer


【解决方案1】:

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

|
\---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]

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

【讨论】:

  • 这太棒了!我更新了我的问题,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多