Batch file 使用robocopy的生成后事件突然停止工作

Batch file 使用robocopy的生成后事件突然停止工作,batch-file,robocopy,post-build-event,Batch File,Robocopy,Post Build Event,我在使用robocopy进行构建后事件时遇到问题。这段代码前几天还可以使用,现在我的任何项目都无法使用。下面是我用于为同一应用程序的不同版本创建插件的后期构建事件的代码 根据Squashman和Mofi的建议进行编辑: 错误显示在visual studio中: Severity Code Description Project File Line Suppression State Error The command "echo Configurat

我在使用robocopy进行构建后事件时遇到问题。这段代码前几天还可以使用,现在我的任何项目都无法使用。下面是我用于为同一应用程序的不同版本创建插件的后期构建事件的代码

根据Squashman和Mofi的建议进行编辑:

错误显示在visual studio中:

Severity    Code    Description Project File    Line    Suppression State
Error       The command "echo Configuration: Debug2019
 
set "Dir2018=C:\Program Files\Rune\Altem 2018\Plugins\"
set "Dir2019=C:\Program Files\Rune\Altem 2019\Plugins\"
set "Dir2020=C:\Program Files\Rune\Altem 2020\Plugins\"
 
if Debug2019 == Debug2018 goto 2018
if Debug2019 == Debug2019 goto 2019
if Debug2019 == Debug2020 goto 2020
 
:2018
 
echo Copying results to 2018
if not exist "%Dir2018%SnoopTool" mkdir "%Dir2018%SnoopTool"
robocopy C:\Users\username\OneDrive\_WORK FILES\_REPOS\nw_issuecreator\nw_issuecreator\SnoopTool\bin\Debug2019\ "%Dir2018%SnoopTool" /XF "*.pdb" /E
if %errorlevel% leq 1 exit 0 else exit %errorlevel%
 
goto exit
 
:2019
 
echo Copying results to 2019
if not exist "%Dir2019%SnoopTool" mkdir "%Dir2019%SnoopTool"
robocopy "C:\Users\username\OneDrive\_WORK FILES\_REPOS\nw_issuecreator\nw_issuecreator\SnoopTool\bin\Debug2019\" "%Dir2019%SnoopTool" /XF "*.pdb" /E
if %errorlevel% leq 1 exit 0 else exit %errorlevel%
 
goto exit
 
:2020
 
echo Copying results to 2020
if not exist "%Dir2020%SnoopTool" mkdir "%Dir2020%SnoopTool"
robocopy C:\Users\username\OneDrive\_WORK FILES\_REPOS\nw_issuecreator\nw_issuecreator\SnoopTool\bin\Debug2019\ "%Dir2020%SnoopTool" /XF "*.pdb" /E
if %errorlevel% leq 1 exit 0 else exit %errorlevel%
 
goto exit
 
:exit" exited with code 16. SnoopTool
如果不存在%Dir2019%$(ProjectName)mkdir%Dir2019%$(ProjectName)
将成功执行。如果目录不存在,它将创建该目录。但是,我认为问题在于下一行
robocopy$(TargetDir)%Dir2019%$(ProjectName)/XF“*.pdb”/E
。我没有改变应用程序中的任何内容,这在我所有的项目中都在发生。这可能是关于机器人技术工作原理的更新吗?我不确定。我完全搞不懂

编辑:

我根据Squashman和Mofi的建议更新了代码,但错误依然存在。我接着删除了大部分事件后代码,以缩小错误范围:

echo Configuration: $(Configuration)
 
echo Copying results to 2019
robocopy $(TargetDir) "C:\Users\username\Documents\New folder (2)"
if %errorlevel% leq 1 exit 0 else exit %errorlevel%

:exit
即使有明确的路径,错误仍然会出现:

Invalid Parameter #3 : "C:\Users\oscarramirez\Documents\New folder (2)"

谢谢你的帮助。如果不明显的话,我是一个业余爱好者。我不是一名开发人员,所以如果我的错误是一个巨大的新手错误,请保持温和。

我建议批处理文件使用以下代码:

echo Configuration: $(Configuration)
set "ConfigNumber=$(Configuration)"
set "ConfigNumber=%ConfigNumber:~-4%"
echo Copying results to %ConfigNumber%
%SystemRoot%\System32\robocopy.exe "$(TargetDir)\" "C:\Program Files\Rune\Altem %ConfigNumber%\Plugins\$(ProjectName)" /XF "*.pdb" /E /R:3 /W:5
就是这样

另一个工作守则是:

echo Configuration: $(Configuration)
set "ConfigNumber=$(Configuration)"
set "ConfigNumber=%ConfigNumber:~-4%"
echo Copying results to %ConfigNumber%
set "SourceDirectory=$(TargetDir)"
if "%SourceDirectory:~-1%" == "\" set "SourceDirectory=%SourceDirectory%\"
%SystemRoot%\System32\robocopy.exe "%SourceDirectory%" "C:\Program Files\Rune\Altem %ConfigNumber%\Plugins\$(ProjectName)" /XF "*.pdb" /E /R:3 /W:5
第二个代码也适用于将
$(TargetDir)
替换为不以反斜杠结尾的目录路径

$(配置)
引用的Visual Studio变量
Configuration
的字符串值被Visual Studio替换,例如,在第一个和第二个命令行中被
Debug2019
替换。因此,第二行使用字符串
Debug2019
定义环境变量
ConfigNumber

第三行仅使用当前字符串值的最后四个字符重新定义环境变量
ConfigNumber
。因此,
ConfigNumber
是在第三行后面用字符串
2019
定义的

对于最后一个命令行,除了在命令提示符窗口中运行
ROBOCOPY/?
时的用法帮助输出,以及Microsoft文档和SS64文章中关于和的两个事实:

  • \
    左至另一个
    \
    的反斜杠
    \
    分别被ROBOCOPY解释为
    \
    的转义字符。在所有其他情况下,反斜杠被解释为文字字符
  • 整个目标目录树是由ROBOCOPY在尚未存在的服务器上自动创建的
  • Visual Studio将
    $(TargetDir)
    替换为分配给Visual Studio变量
    TargetDir
    的字符串值,该字符串值以反斜杠结尾

    Windows命令处理器
    cmd.exe
    必须在ROBOCOPY命令行
    “$(TargetDir)”
    中使用,才能同时用于包含空格或其中一个字符的目录路径
    &(){}^=;!”+`~

    由于第一个事实,ROBOCOPY将目录路径末尾的反斜杠解释为
    的转义字符。因此ROBOCOPY将解释
    位于目标路径的末尾,作为属于目标路径的文字字符,尽管目录路径根本不能包含Microsoft在关于的文档中描述的字符。
    “。因此,ROBOCOPY将解释到
    为止的所有内容。”
    在目标参数字符串的开头作为源参数字符串。这显然是ROBOCOPY不需要的参数字符串解释

    解决方案是在
    $(TargetDir)
    后面附加一个反斜杠,并用于源参数
    “$(TargetDir)\”
    。Visual Studio生成的目标目录路径末尾的反斜杠现在被解释为反斜杠的转义字符,该反斜杠由ROBOCOPY显式添加到参数字符串中。第一个目录路径参数字符串末尾的双引号字符现在由ROBOCOPY解释为源目录路径的结尾

    也可以使用“$(TargetDir)。”,点表示当前目录ROBOCOPY在这种情况下将反斜杠解释为文字字符,因为下一个字符是
    ,而不是
    \
    。在访问源目录时,Windows文件管理会将现在以
    \.
    结尾的目录路径替换为不以
    \.
    结尾的绝对目录路径

    如果不存在,则无需使用命令检查文件复制任务的目标目录是否存在,也无需使用命令MKDIR创建目标目录ROBOCOPY在尚未存在的目标目录上自动创建指定目标目录的整个目录树

    Windows命令处理器将退出代码ROBOCOPY分别传递给调用进程的批处理文件。因此,不需要更多的线路

    也可以在第二个代码中使用:

    if "%SourceDirectory:~-1%" == "\" set "SourceDirectory=%SourceDirectory:~0,-1%"
    
    该命令行删除目录路径末尾的反斜杠,而不是再追加一个反斜杠。这适用于除驱动器根目录路径以外的所有目录路径,即
    C:\
    e:\
    。VisualStudio构建的目标目录不太可能是驱动器的根目录,但这是可能的

    机器人足球
    echo Configuration: $(Configuration)
    set "ConfigNumber=$(Configuration)"
    set "ConfigNumber=%ConfigNumber:~-4%"
    echo Copying results to %ConfigNumber%
    set "SourceDirectory=$(TargetDir)"
    if "%SourceDirectory:~-1%" == "\" set "SourceDirectory=%SourceDirectory%\"
    %SystemRoot%\System32\robocopy.exe "%SourceDirectory%" "C:\Program Files\Rune\Altem %ConfigNumber%\Plugins\$(ProjectName)" /XF "*.pdb" /E /R:3 /W:5
    
    if "%SourceDirectory:~-1%" == "\" set "SourceDirectory=%SourceDirectory:~0,-1%"
    
    if not errorlevel 8 (exit /B 0) else exit /B 1
    if not errorlevel 2 exit /B 0
    
    if %errorlevel% leq 1 exit 0 else exit %errorlevel%
    
    if %errorlevel% leq 1 exit 0 Batch processing exits with value 0 on condition is true.