如何将 post-build 事件命令行传输到 MsBuild 中的批处理文件?
How to transfer post-build event command line to batch file in MsBuild?
在我的演示项目的构建事件中,(一个 class 库项目),将构建结果 .dll
复制到特定文件夹,(如果不存在则自动创建),我在 Post-build event
命令行部分添加了以下命令行:
xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"
它完美运行。
然后我尝试用对位于 $(SolutionDir) 中名为 CopyPackage.bat 的新批处理文件的调用替换该命令行。批处理文件的内容正是上面的命令行:
call $(SolutionDir)CopyPackage.bat
然后我重建项目并得到以下错误:
Severity Code Description Project File Line Suppression State
Error The command "call C:\TestProjects\DemoApp\CopyPackage.bat" exited with code 4. DemoApp
我错过了什么吗?
解决方案 在得到大家的一些提示后:
在post-构建事件命令行中我输入:(查看参数)
$(SolutionDir)CopyPackage.bat "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"
在批处理文件CopyPackage.bat中:
set targetfile=%~1
set targetdir=%~2
echo %targetfile%
echo %targetdir%
xcopy /Y %targetfile% %targetdir%
call
是 cmd.exe
的内部命令,你应该使用
cmd.exe /c "$(SolutionDir)CopyPackage.bat"
相反。
编辑:
The content of the batch file is exactly the command line above
VS 变量无法在 .bat 文件中正确解析。您应该将它们作为参数传递给批处理文件。
无需使用call
您可以直接调用批处理脚本。
我不得不提醒你,因为 post-build 目标无法知道任务的输入和输出,它总是必须执行脚本,即使没有任何改变。
相反,如果您将其转换为 msbuild 目标并正确实施 input/output 信号,您将通过利用 MsBuild 的增量构建功能获得大量时间。
例如:
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
可以找到有关增量构建和 input/output 信号的更多信息:
Changing the path in your CopyPackage.bat to absolute path can help resolve this.
像这样的属性:$(TargetDir)、$(SolutionDir) 被 msbuild.exe 工具识别,因为它们是 msbuild 属性的一部分并且被定义或导入到当前环境中。
在post-build-event中使用xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"
时,msbuild工具第一次可以识别them.So,成功。
不过,第二次了。 msbuild 引擎可以识别 post-build-event 中的属性,因此它成功调用了 .bat。但是由于.bat无法识别Msbuild 属性(这些属性只能被MSbuild.exe识别,不能被.bat或cmd.exe识别),构建会因为找不到路径而失败.
在我的演示项目的构建事件中,(一个 class 库项目),将构建结果 .dll
复制到特定文件夹,(如果不存在则自动创建),我在 Post-build event
命令行部分添加了以下命令行:
xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"
它完美运行。
然后我尝试用对位于 $(SolutionDir) 中名为 CopyPackage.bat 的新批处理文件的调用替换该命令行。批处理文件的内容正是上面的命令行:
call $(SolutionDir)CopyPackage.bat
然后我重建项目并得到以下错误:
Severity Code Description Project File Line Suppression State Error The command "call C:\TestProjects\DemoApp\CopyPackage.bat" exited with code 4. DemoApp
我错过了什么吗?
解决方案 在得到大家的一些提示后:
在post-构建事件命令行中我输入:(查看参数)
$(SolutionDir)CopyPackage.bat "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"
在批处理文件CopyPackage.bat中:
set targetfile=%~1
set targetdir=%~2
echo %targetfile%
echo %targetdir%
xcopy /Y %targetfile% %targetdir%
call
是 cmd.exe
的内部命令,你应该使用
cmd.exe /c "$(SolutionDir)CopyPackage.bat"
相反。
编辑:
The content of the batch file is exactly the command line above
VS 变量无法在 .bat 文件中正确解析。您应该将它们作为参数传递给批处理文件。
无需使用call
您可以直接调用批处理脚本。
我不得不提醒你,因为 post-build 目标无法知道任务的输入和输出,它总是必须执行脚本,即使没有任何改变。
相反,如果您将其转换为 msbuild 目标并正确实施 input/output 信号,您将通过利用 MsBuild 的增量构建功能获得大量时间。
例如:
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
可以找到有关增量构建和 input/output 信号的更多信息:
Changing the path in your CopyPackage.bat to absolute path can help resolve this.
像这样的属性:$(TargetDir)、$(SolutionDir) 被 msbuild.exe 工具识别,因为它们是 msbuild 属性的一部分并且被定义或导入到当前环境中。
在post-build-event中使用xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"
时,msbuild工具第一次可以识别them.So,成功。
不过,第二次了。 msbuild 引擎可以识别 post-build-event 中的属性,因此它成功调用了 .bat。但是由于.bat无法识别Msbuild 属性(这些属性只能被MSbuild.exe识别,不能被.bat或cmd.exe识别),构建会因为找不到路径而失败.