构建后事件与一个项目合作而不是其他项目

时间:2016-09-13 10:47:59

标签: windows batch-file visual-studio-2015 post-build-event

我有2个项目,我正在尝试创建一个通用的Post-Build事件批处理文件。

以下是Visual Studio中的命令:

构建后活动

if $(ConfigurationName) == Release ("$(ProjectDir)PostBuildRelease.bat" "$(TargetDir)" @(VersionNumber) "$(TargetFileName)" "$(TargetName)")

所以我用4个参数调用文件PostBuildRelease.bat

  • Bin \ Release Directory
  • 项目版本
  • 带扩展名的文件名
  • 无扩展名的文件名

项目1

这与此批处理脚本完美配合:

CMD

SET parameter=%1 REM Full path to new bin\release\
SET parameter=%2 REM Full Version Number
SET parameter=%3 REM File name + extension
SET parameter=%4 REM File name - extension
SET "productionpath=Z:\Unused\Apps\LyncVdiChecker\"

MOVE %productionpath%%3 %productionpath%"_archive\"%4"."%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%"-"%2
XCOPY %3 %productionpath%

将程序集复制到Z:\Unused\Apps\LyncVdiChecker\并将现有版本复制到同一文件夹中的_archive。存档版本还具有替换文件扩展名的日期和版本号。

项目2

这个批处理脚本也可以完美地工作(它做同样的事情但是在不同的文件夹和不同的项目中):

CMD

SET parameter=%1 REM Full path to new bin\release\
SET parameter=%2 REM Full Version Number
SET parameter=%3 REM File name + extension
SET parameter=%4 REM File name - extension
SET "productionpath=Z:\Unused\Apps\IT Support App\"

MOVE "Z:\Unused\Apps\IT Support App\"%3 "Z:\Unused\Apps\IT Support App\_archive\"%4"."%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%"-"%2
XCOPY %3 "Z:\Unused\Apps\IT Support App"

但是,如果我尝试在Project1中使用Project2(更通用的版本)中的相同脚本,我会收到错误,即使这2个脚本是等效的:

错误

  

命令"如果Release == Release(" C:\ Users \ Seb.Kotze \ Source \ Repos \ Applications \ ITSelfHelp \ ITHelp \ PostBuildRelease.bat"" C: \ Users \ Seb.Kotze \ Source \ Repos \ Applications \ ITSelfHelp \ ITHelp \ bin \ Release \" 2.0.6100.20905" IT Self Help.exe"" IT Self Help" )"退出代码4。

输出窗口:

  

该命令的语法不正确。

     

参数数量无效

此错误相当无用,因此我尝试评论出2行MOVEXCOPY并再次构建:

删除了MOVE

与上述相同的错误。

输出窗口:

  

参数数量无效

删除XCOPY

没有Visual Studio错误,但这会出现在输出窗口中:

  

该命令的语法不正确。

参数输出

当我回显Project2中使用的参数时,一切似乎都按顺序排列:

"Path\to\Bin\Release"
2.0.6100.21082
"IT Self Help.exe"
"IT Self Help"
Z:\Unused\Apps\IT Support App\

如何调试此问题?我的脚本如何可以正常运行而没有任何问题,但是当针对不同的项目运行时,没有任何命令被识别?对此有任何帮助非常感谢!

3 个答案:

答案 0 :(得分:1)

问题是脚本正在弄乱双引号导致无效路径和传递的参数数量无效。处理动态构建的路径时,最好从部件中剥离任何现有的,并在路径完成后将其包围在中。

MSDN上解释了处理批处理参数的问题。变量的相同内容可以在SS64上找到。

我玩了一下文件,我能够运行它(从命令行)。您应在( Project1 )文件中进行的更改:

SET productionpath="Z:\Unused\Apps\LyncVdiChecker\"
MOVE "%productionpath:"=%%~3" "%productionpath:"=%_archive\%~4.%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%-%~2"
XCOPY "%~3" "%productionpath:"=%"

我将productionpath行移动到其内容的开头。这种方式适用于包含 SPACE 的路径。

MOVEXCOPY行中,我做了我上面解释的内容:即使语法不清楚,它也更健壮(最后"%productionpath:"=%"可以简单地写为%productionpath%,但为了保持一致,我把它保留在第一种形式中。

注意:您可以在批处理开头删除CMD命令,因为它会启动一个新的 cmd 实例(进程)端。

答案 1 :(得分:1)

你应该规范化所有参数,因此它们不包含外引号 然后你可以以可靠的方式使用它们 语法set "variable=%~1"避免了变量本身的外引号。

set "TargetDir=%~1"
set "VersionNumber=%~2"
set "TargetFileName=%~3"
set "TargetName=%~4"
SET "productionpath=Z:\IT Support App\"
set "dateStamp=%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%"

MOVE "Z:\IT App\%TargetFileName%" "Z:\IT App\_archive\%TargetName%.%dateStamp%-%VersionNumber%"
XCOPY "%TargetFileName%" "Z:\IT App"

答案 2 :(得分:0)

我找到了解决方法,但我仍然不确定原因是什么。

我怀疑它与以下任何一个有关:

  • productionpath中导致命令参数声明转义的空格

  • 围绕创建不存在的文件路径的一个或多个参数的引用

在尝试对脚本进行一些更改后,我发现将productionpath声明更改为SET productionpath="Z:\Unused\Apps\IT Support App\"解决了这个问题:

CMD

SET parameter=%1 REM Full path to new bin\release\
SET parameter=%2 REM Full Version Number
SET parameter=%3 REM File name + extension
SET parameter=%4 REM File name - extension
SET productionpath="Z:\Unused\Apps\IT Support App\"

MOVE "Z:\Unused\Apps\IT Support App\"%3 "Z:\Unused\Apps\IT Support App\_archive\"%4"."%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%"-"%2
XCOPY %3 "Z:\Unused\Apps\IT Support App"

Project1脚本进行相同的更改也不会导致其中断,所以这似乎是安全的。

<强>更新

在阅读了其他一些答案之后,我再次将脚本修改为以下内容:

CMD

SET "TargetDir=%~1"
SET "VersionNumber=%~2"
SET "TargetFileName=%~3"
SET "TargetName=%~4"

SET "ProductionPath=Z:\Unused\Apps\IT Support App\"
SET "ArchivePath=%ProductionPath%_archive\"
SET "DateStamp=%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%"

MOVE "%ProductionPath%%TargetFileName%" "%ArchivePath%%TargetName%.%DateStamp%-%VersionNumber%"
XCOPY "%TargetFileName%" "%ProductionPath%"

注意&#34;标准化&#34;参数 - 这将从其值中删除所有引号。

现在也使用命名参数。