我有2个项目,我正在尝试创建一个通用的Post-Build事件批处理文件。
以下是Visual Studio中的命令:
if $(ConfigurationName) == Release ("$(ProjectDir)PostBuildRelease.bat" "$(TargetDir)" @(VersionNumber) "$(TargetFileName)" "$(TargetName)")
所以我用4个参数调用文件PostBuildRelease.bat
:
这与此批处理脚本完美配合:
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
。存档版本还具有替换文件扩展名的日期和版本号。
这个批处理脚本也可以完美地工作(它做同样的事情但是在不同的文件夹和不同的项目中):
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行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\
如何调试此问题?我的脚本如何可以正常运行而没有任何问题,但是当针对不同的项目运行时,没有任何命令被识别?对此有任何帮助非常感谢!
答案 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 的路径。
在MOVE
和XCOPY
行中,我做了我上面解释的内容:即使语法不清楚,它也更健壮(最后"%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;参数 - 这将从其值中删除所有引号。
现在也使用命名参数。