我在Windows批处理文件中有以下脚本,该文件提取DLL文件的版本,并通过在其文件名中插入版本来重命名现有文件。当我将它放在.bat文件中并在Windows中运行时,这很好用。生成的文件名是GCSv1.1.0.7316.zip。
SET WMICommand="WMIC DATAFILE WHERE name='E:\\Projects\\GCS\\bin\\Debug\\Client.dll' get Version /value"
for /f "tokens=2 delims==" %%x in ('%WMICommand%') do (set vers=%%x)
echo %vers%
echo GCS_v%vers%.zip
ren E:\Projects\GCS\InstallerTemplateProject\DeployFolder\GCS_Package.zip GCS_v%vers%.zip
我需要使用相同的脚本并将其放在Visual Studio中的Post-build事件命令行中,以将生成的文件重命名为构建过程的最后一步。具体如下:
SET WMICommand="WMIC DATAFILE WHERE name='$(SolutionDir)GCS\bin\debug\\Client.dll' get Version /value"
for /f "tokens=2 delims==" %%x in ("%WMICommand%") do (set vers=%%x)
ren "$(SolutionDir)GCS\InstallerTemplateProject\DeployFolder\GCS_Package.zip" GCS_v%vers%.zip
但由于某种原因,重命名没有正确发生,因为它正在重命名为GCS_v.zip。 很明显,当它在Post-build事件命令行中时,没有设置%vers%变量。为什么它在Windows上的.bat文件中执行时有效,但在后期构建中执行时却不行?我应该在这里对变量做些什么?目标是让第二批在Visual Studio中运行。我写的第一批只是为了测试它。
答案 0 :(得分:0)
每个批处理文件都是独立调用的,并实例化自己的环境,因此第二批文件不会获取第一批变量所做的更改。
两个明显的解决方案
将setx
set
变量用于第二批(其缺点是也包含在{{{}后面的任何其他批次的环境中1}}) - 然后可能使用setx
清除第二批中的变量。
将变量写入文件并将文件读回第二批。
啊 - 我的错误解释,是由撇脂引起的。我假设第一批是预构建,第二批是后期构建。问题似乎是VS没有将{em>实际(并且无疑是每个项目)的值替换为setx
到批处理中 - 这在逻辑上是无法做到的,因为无法保证Solutiondir
不是随机批处理文件中具有其他解释的字符串。
我建议你试试
$(whatever)
作为构建后批处理中的第一个命令,它将创建一个包含大多数环境变量值的文件。很可能是一个名为set>afilename.txt
之类的变量安装在构建后批处理的环境中 - 但我无法保证......