首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Guids为Wix使用批处理文件生成依赖项

使用Guids为Wix使用批处理文件生成依赖项
EN

Stack Overflow用户
提问于 2017-01-04 23:11:07
回答 1查看 170关注 0票数 0

我有一个Wix设置的项目,我试图找出一种方法,不包括每一个依赖手动,因为我必须它的一堆不同的项目。

我试图在预构建时使用一个批处理文件,它看起来像

代码语言:javascript
运行
复制
@echo off
set TARGETDIRECTORY=%1
set OUTPUTFILE=%2
set PROJDIR=%3
echo Starting Dependency check...
echo ^<?xml version="1.0" encoding="UTF-8"?^> > %OUTPUTFILE%
echo ^<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"^> >> %OUTPUTFILE%
echo   ^<Fragment^> >> %OUTPUTFILE%
echo     ^<ComponentGroup Id="MyWebApiBinaries" Directory="INSTALLFOLDER"^> >> %OUTPUTFILE%

for %%F in (%TARGETDIRECTORY%\*.dll) do (
    echo "-- Adding %%~nxF" 
    echo "-- Calling %PROJDIR%Uuidgen.Exe"
    %PROJDIR%Uuidgen.Exe> %PROJDIR%temp.txt
    set /p aGUID=<%PROJDIR%temp.txt
    del %PROJDIR%temp.txt
    echo "-- Adding %aGUID%"
    echo       ^<Component Id="%%~nxF" Guid="%aGUID%"^> >> %OUTPUTFILE%
    echo                     ^<File  Id="%%~nxF" Name="%%~nxF" Source="%%~dpnxF" Vital="yes" KeyPath="yes" DiskId="1"/^> >> %OUTPUTFILE%
    echo       ^</Component^> >> %OUTPUTFILE%
)

echo     ^</ComponentGroup^> >> %OUTPUTFILE%
echo   ^</Fragment^> >> %OUTPUTFILE%
echo ^</Wix^> >> %OUTPUTFILE%
echo Dependency check done.

这个想法是从this answer获得的,只是我需要添加一个GUID,因为我是在inetpub而不是Program上安装的。因此,我在项目中包括了uuidgen.exe,以生成GUID。我调用exe并将guid回显到一个临时文件中,我后来尝试读取这个文件,只是它没有读取它。我在一个不同的批处理文件上尝试过这种方法,并手动调用它,并且它确实读取它,所以我不知道为什么它在这里不工作。基本上我指的是这两句话:

代码语言:javascript
运行
复制
%PROJDIR%Uuidgen.Exe> %PROJDIR%temp.txt
set /p aGUID=<%PROJDIR%temp.txt

我已经删除了delete,以检查文件是否生成guid并正在创建,并且它就在那里,所以我知道它必须是第二行。

我也试过跑步

代码语言:javascript
运行
复制
for /f %%i in ('"%PROJDIR%\Uuidgen.Exe"') do set GUID=%%i

而不是其他两行,但是我没有得到这个变量的guid

我知道它没有实现,因为我添加了一个带有变量的回显,而且%OUTPUTFILE%也是用一个Guid=“(只是一个空字符串/变量)生成的。知道为什么它不会得到变量上的guid吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-05 12:08:09

这是我们的老朋友delayed expansion问题。

关于块内的变量扩展有大量的问题。

当命令处理器找到一个块(括号之间的任何内容)时,将其完全解析,并将变量展开到它们在计算块时的值。如果在块中更新变量值,则需要启用该变量的延迟展开以反映所做的更改。此外,还必须将var语法从%var%更改为!var!

在您的代码中,aGUID var是在for块中生成的,因此它被扩展到块开始时它所持有的值(在您的例子中是emptyundefined)。若要更新for块的每次迭代的值,您需要启用延迟展开。

另一个解决方法是使用一个新的for循环来获取uuidgen.exe的输出,因为for变量总是内联展开的。这种方法给了您另一个好处,您不需要临时文件。

注意:另外,您正在将多行写入一个文件,请注意

代码语言:javascript
运行
复制
>"%output%" (
   for ... do (
     echo(...
     echo(...
   )
)  

只打开文件一次,而

代码语言:javascript
运行
复制
   for ... do (
     echo(...>>"%output%"
     echo(...>>"%output%"
   )

在使用>>"%output%“重定向时,打开并关闭该文件,因此首先要加快块的速度。

顺便说一句

代码语言:javascript
运行
复制
>"%output%" (
   for ... do (
     ...
   )
)  

是相同的

代码语言:javascript
运行
复制
(
   for ... do (
     ...
   )
)>"%output%"  

最后,它的最佳实践包含在引用var namevar content中,如

代码语言:javascript
运行
复制
set "TARGETDIRECTORY=%~1"

为了去掉不想要的尾随空格,%~1也意味着没有引号的第一个参数。

还没测试过。可点工作码

代码语言:javascript
运行
复制
@echo off
SetLocal

set "TARGETDIRECTORY=%~1"
set "OUTPUTFILE=%~2"
set "PROJDIR=%~3"

if not "%TARGETDIRECTORY%" EQU "" if not "%OUTPUTFILE%" EQU "" echo Missing argument/s.& exit/B
if not exist "%PROJDIR%Uuidgen.Exe" echo Uuidgen.exe not found or missing argument.& exit/B

echo Starting Dependency check...

>"%OUTPUTFILE%" (
  echo ^<?xml version="1.0" encoding="UTF-8"?^>
  echo ^<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"^>
  echo   ^<Fragment^>
  echo     ^<ComponentGroup Id="MyWebApiBinaries" Directory="INSTALLFOLDER"^>

  for %%F in (%TARGETDIRECTORY%\*.dll) do (
      for /F %%U in ('"%PROJDIR%Uuidgen.Exe"') do (
         echo "-- Adding %%~nxF - GUID %%U" >CON
         echo       ^<Component Id="%%~nxF" Guid="%%U"^>
         echo                     ^<File  Id="%%~nxF" Name="%%~nxF" Source="%%~dpnxF" Vital="yes" KeyPath="yes" DiskId="1"/^>
         echo       ^</Component^>
      )   
  )

  echo     ^</ComponentGroup^>
  echo   ^</Fragment^>
  echo ^</Wix^>
)

echo Dependency check done.
EndLocal
exit /B

由于所有输出都被重定向到OUTPUTFILE,所以您想要显示的任何消息都必须重定向到标准输出>CON,这就是为什么echo "-- Adding %%~nxF - GUID %%U" >CON

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41474780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档