我有一个Wix设置的项目,我试图找出一种方法,不包括每一个依赖手动,因为我必须它的一堆不同的项目。
我试图在预构建时使用一个批处理文件,它看起来像
@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回显到一个临时文件中,我后来尝试读取这个文件,只是它没有读取它。我在一个不同的批处理文件上尝试过这种方法,并手动调用它,并且它确实读取它,所以我不知道为什么它在这里不工作。基本上我指的是这两句话:
%PROJDIR%Uuidgen.Exe> %PROJDIR%temp.txt
set /p aGUID=<%PROJDIR%temp.txt我已经删除了delete,以检查文件是否生成guid并正在创建,并且它就在那里,所以我知道它必须是第二行。
我也试过跑步
for /f %%i in ('"%PROJDIR%\Uuidgen.Exe"') do set GUID=%%i而不是其他两行,但是我没有得到这个变量的guid
我知道它没有实现,因为我添加了一个带有变量的回显,而且%OUTPUTFILE%也是用一个Guid=“(只是一个空字符串/变量)生成的。知道为什么它不会得到变量上的guid吗?
发布于 2017-01-05 12:08:09
这是我们的老朋友
delayed expansion问题。
关于块内的变量扩展有大量的问题。
当命令处理器找到一个块(括号之间的任何内容)时,将其完全解析,并将变量展开到它们在计算块时的值。如果在块中更新变量值,则需要启用该变量的延迟展开以反映所做的更改。此外,还必须将var语法从%var%更改为!var!。
在您的代码中,aGUID var是在for块中生成的,因此它被扩展到块开始时它所持有的值(在您的例子中是empty或undefined)。若要更新for块的每次迭代的值,您需要启用延迟展开。
另一个解决方法是使用一个新的for循环来获取uuidgen.exe的输出,因为for变量总是内联展开的。这种方法给了您另一个好处,您不需要临时文件。
注意:另外,您正在将多行写入一个文件,请注意
>"%output%" (
for ... do (
echo(...
echo(...
)
) 只打开文件一次,而
for ... do (
echo(...>>"%output%"
echo(...>>"%output%"
)在使用>>"%output%“重定向时,打开并关闭该文件,因此首先要加快块的速度。
顺便说一句
>"%output%" (
for ... do (
...
)
) 是相同的
(
for ... do (
...
)
)>"%output%" 最后,它的最佳实践包含在引用var name和var content中,如
set "TARGETDIRECTORY=%~1"为了去掉不想要的尾随空格,%~1也意味着没有引号的第一个参数。
还没测试过。可点工作码
@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
https://stackoverflow.com/questions/41474780
复制相似问题