Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发布后脚本不';我发布web应用程序时不会运行_C#_Asp.net_Batch File_Msbuild_Publishing - Fatal编程技术网

C# 发布后脚本不';我发布web应用程序时不会运行

C# 发布后脚本不';我发布web应用程序时不会运行,c#,asp.net,batch-file,msbuild,publishing,C#,Asp.net,Batch File,Msbuild,Publishing,我有一个ASP.NET web应用程序,当我进行更改或修复错误时,我会将其发布到我们的网站。我们希望自动将项目文件的备份保存到服务器(与SVN签入分开),因此我编写了一个批处理文件,将整个项目从本地驱动器复制到服务器。批处理文件在单独运行时可以正常工作,所以这不是问题所在。如果存在问题,批处理文件不在项目路径中 然后,我将这些行添加到.csproj文件中,就在结束标记的正上方: <Target Name="AfterPublish" > <Exec Command="C

我有一个ASP.NET web应用程序,当我进行更改或修复错误时,我会将其发布到我们的网站。我们希望自动将项目文件的备份保存到服务器(与SVN签入分开),因此我编写了一个批处理文件,将整个项目从本地驱动器复制到服务器。批处理文件在单独运行时可以正常工作,所以这不是问题所在。如果存在问题,批处理文件不在项目路径中

然后,我将这些行添加到.csproj文件中,就在结束标记的正上方:

<Target Name="AfterPublish" >
    <Exec Command="C:\deg\bat\backupRMA.cmd" />
</Target>
我使用Build>PublishRMA在VS2010中发布,效果很好。只是备份脚本从未运行过。唯一的共同点是脚本本身。我见过其他使用从源目录到目标目录的副本的示例,但我想我知道可以通过Exec命令调用外部脚本


我确信我遗漏了一些明显的东西,但我已经进入了第二天,我在处理一些看起来很简单的东西,那么我遗漏了什么呢?

当您手动运行cmd文件时,脚本肯定会以管理员权限运行,或者有足够的权限成功地将文件复制到目标(在I中:本例中为单位)

由于安全原因,从VisualStudio执行脚本的线程可能具有非常有限的权限

最好从powershell运行脚本,并将以下参数传递给它:

-执行策略不受限制

您的
XML
将如下所示:

<Target Name="BackUpRMAToIDrive" AfterTargets="MSDeployPublish" >
    <Exec Command="C:\deg\bat\backupRMA.cmd" />
</Target>
<Target Name="CustomPostPublishActions" AfterTargets="MSDeployPublish">
  <PropertyGroup>
    <PowerShellExe Condition=" '$(PowerShellExe)'=='' "> 
      %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
    </PowerShellExe>
    <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
      C:\deg\bat\backupRMA.cmd
    </ScriptLocation>
  </PropertyGroup>
  <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted 
                 -command &quot;&amp; invoke-command -scriptblock { 
                          &amp;&apos;$(ScriptLocation)&apos; 
                          }
                          &quot;"/>  
</Target>

%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
C:\deg\bat\backupRMA.cmd
您还可以检查此MSDN链接以获取类似命令:


我看到一位微软开发人员的评论说,进入“文件系统”的发布不会调用MSDeployPublish target。您可以在这里看到

在*.targets文件中,我可以将一些目标放在PostTargets属性中,这些目标是在发布复制到临时obj输出文件夹后完成运行的。在复制到发布配置文件中定义的实际文件夹后,我再也找不到运行的目标

以下是我认为您需要的:

  <Target Name="BackUpRMAToIDrive" AfterTargets="CopyAllFilesToSingleFolderForPackage">
    <Exec Command="C:\deg\bat\backupRMA.cmd" />
  </Target>


不过,我不确定您正在备份什么-原始源代码还是已发布的源代码。在执行此执行时,如果您需要“已发布文件”的路径,可以通过$(WebProjectOutputDir)\$(WPPallFilesIngleFolder)将参数传递给脚本。这类似于
c:\{path to*.csproj}\obj\{生成配置}\Package\PackageTmp

每个人都明白了吗?有类似的问题。不,对不起,从来没有。我上周刚刚对这段代码做了一些更改,不得不手工完成所有操作。如果你明白了,请确保将步骤发布到这里!我想这没有改变,你最终能够找到一个在复制后运行的步骤到发布配置文件中定义的实际文件夹?@Maslow-否。我想我不需要它。我只是想把一个包含发布时收集的附加元信息的文件(即发布原因、任务修复等)放在最终输出目录中。因此我可以简单地将它放在
$(WebProjectOutputDir)中\$(wppallfilesinglefolder)
当VS完成发布时,它将我的文件与所有其他文件一起移动。您想做什么?我通过文件结构和本地复制repo解决了这一问题-如自述文件中所述-
  <Target Name="BackUpRMAToIDrive" AfterTargets="CopyAllFilesToSingleFolderForPackage">
    <Exec Command="C:\deg\bat\backupRMA.cmd" />
  </Target>