2016-01-06 65 views
3

我们有大量的构建经常发生大量源。因此,我们希望在每次构建之后构建源代码和分段目录。我正在使用内部版本的TFS 2015 Update 1中的vNext版本。我创建了一个PowerShell脚本作为执行删除最后一个任务:当在TFS版本结束时运行时删除项错误

[CmdletBinding()] 
param() 

begin { 
    function Delete-Directory { 
     param([string]$directory) 

     Write-Output "Attempting to delete '$($directory)'" 

     if (Test-Path $directory -pathType container) { 
      Get-ChildItem -Path $directory -Force -Recurse | Remove-Item -Recurse -Force 
      Write-Output "Successfully deleted the directory: '$($directory)'" 
     } else { 
      Write-Output "Failed to delete '$($directory)' as it does not exist" 
     } 
    } 
} 

process { 
    Delete-Directory $env:BUILD_SOURCESDIRECTORY 
    Delete-Directory $env:BUILD_STAGINGDIRECTORY 
} 
end{} 

本来,而是采用Get-ChildItem .... | Remove-Item,我用Remove-Item *path* -Recurse -Force但显然有一个与recurse parameter of Remove-Item一个问题。最初它有时工作。现在它从来没有工作。

我已经尝试了许多不同的变体,这里是一些结果:

随着-Recurse-Force

Get-ChildItem -Path $directory -Force -Recurse | Remove-Item -Recurse -Force 

等于:

Get-ChildItem : Access to the path 'E:\GeneralAgent1\_work\3\s\TfsBuild' is 
denied. 
At E:\GeneralAgent1\_work\3\s\TfsBuild\Scripts\DeleteSources.ps1:11 char:5 
+ Get-ChildItem -Path $directory -Force -Recurse | Remove-Item -Recurse -Force 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo : PermissionDenied: (E:\GeneralAgent1\_work\3\s\TfsBuild:String) [Get-ChildItem], Unauthor 
izedAccessException 
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

没有-Recurse

Get-ChildItem -Path $directory -Force -Recurse | Remove-Item -Force 

等于:

Remove-Item : Windows PowerShell is in NonInteractive mode. Read and Prompt 
functionality is not available. 
At E:\GeneralAgent1\_work\3\s\TfsBuild\Scripts\DeleteSources.ps1:11 char:54 
+ Get-ChildItem -Path $directory -Force -Recurse | Remove-Item -Force 
+ ~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo : InvalidOperation: (:) [Remove-Item], PSInvalidOperationException 
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RemoveItemCommand

没有-Force

Get-ChildItem -Path $directory -Force -Recurse | Remove-Item -Recurse 

返回大量错误的,1是权限被拒绝和其他人不能删除由于不被emtpy由于权限被拒绝之前:

Remove-Item : Cannot remove item 
E:\GeneralAgent1\_work\3\s\Proxies\Development\Isd.Proxies.BO_16.01.1\Avalara\StyleCop.Cache: 
You do not have sufficient access rights to perform this operation. 
At E:\GeneralAgent1\_work\3\s\TfsBuild\Scripts\DeleteSources.ps1:11 char:54 
+ Get-ChildItem -Path $directory -Force -Recurse | Remove-Item -Recurse 
+ ~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo : PermissionDenied: (StyleCop.Cache:FileInfo) [Remove-Item], IOException 
    + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCommand 
...... 
Lots

没有-Recurse-Force

Get-ChildItem -Path $directory -Force -Recurse | Remove-Item 

等于:

Remove-Item : Windows PowerShell is in NonInteractive mode. Read and Prompt 
functionality is not available. 
At E:\GeneralAgent1\_work\3\s\TfsBuild\Scripts\DeleteSources.ps1:11 char:54 
+ Get-ChildItem -Path $directory -Force -Recurse | Remove-Item 
+ ~~~~~~~~~~~ 
    + CategoryInfo : InvalidOperation: (:) [Remove-Item], PSInvalidOperationException 
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RemoveItemCommand

我也尝试过其他组合并与Get-ChildItem参数出场,并得到了类似的结果。

构建代理帐户具有对根目录的完全权限。

请帮忙吗?

回答

3

你应该可以,如果你从下往上去删除所有内容。排序中删除项目之前降序排列的Get-ChildItem结果通过其全名:

Get-ChildItem -Path $directory -Force -Recurse | 
    Sort-Object -Property FullName -Descending | 
    Remove-Item -Recurse -Force 
+0

这看起来已经成功了。这也是有道理的。我想,不排序只会按照某种标准顺序枚举并尝试在孩子之前删除父项。谢谢 – Rodders

0

不知道这是你的修复,但我这样做只是有点不同

Get-ChildItem $FolderPath | ForEach-Object ($_){ 
    Remove-Item $_.FullName -Recurse -Force 
} 
+0

删除-项目:无法删除项目E:\ GeneralAgent1 \ _work \ 3 \ S \代理\发展:目录不为空。 – Rodders

+0

听起来像你有东西持有一个文件。您是否尝试过在构建完成后不作为构建的一部分执行此脚本并手动执行它?如果脚本是脚本执行的时机是问题,那么它可能有助于解决问题。 –

+0

有意思的是,如果我以后手动执行它,它会起作用 – Rodders