【发布时间】:2014-05-21 07:29:48
【问题描述】:
我是 PowerShell 新手。
我正在尝试自动将 dll 组件从源服务器上的文件夹部署到目标服务器上的多个文件夹。这看起来应该很简单:将组件从源服务器上的源(部署)文件夹复制到目标服务器上的文件夹,验证副本,最后从源服务器上的部署文件夹中删除组件。
将文件从源服务器复制到目标服务器没有问题。 但是,当脚本继续从源服务器中删除组件时,我会间歇性地遇到错误: “删除项目错误:无法删除项目 [项目路径和名称]:访问路径“[项目路径和名称]”被拒绝。”
我已经多次运行这个脚本;有时它会毫无问题地完成,有时会出现错误。并非每个要删除的文件都会发生该错误,并且似乎每次出现时都会在不同的组件上发生。
下面是我写的删除组件和验证删除的函数:
function DeleteSourceFiles($srcPath) {
# Announce delete
OutputToHostAndLog ("Files will be removed from "+$srcPath+"...")
OutputToHostAndLog "Removing files..."
# Deletes all file items (i.e. all except folders) in source folder
$filesToDelete=Get-ChildItem $srcPath | Where-Object {$_ -is [IO.FileInfo]}
ForEach($item in $filesToDelete) {
Remove-Item $srcPath\$item -force
# Verify deletions
if(Test-Path($srcPath+"\"+$item)) {
OutputToHostAndLog ("Delete failed: "+$item.Name)
$fail++
}
else {
OutputToHostAndLog ($item.Name+" deleted successfully...")
}
}
}
在 Remove-Item cmdlet 中使用 -force 参数似乎对该问题没有任何影响。这些文件(同样,每次失败的不同文件)似乎都不是 isReadOnly 。
同样,以管理员身份运行 PowerShell 似乎没有任何效果,尽管源文件夹的 Get-Acl 表明管理员应该拥有 FullControl。
这是我缺少的权限问题吗? 任何建议都非常感谢...
编辑: 我因此更新了我的脚本:
function DeleteSourceFiles($srcPath) {
# Announce delete
OutputToHostAndLog ("Files will be removed from "+$srcPath+"...")
OutputToHostAndLog "Removing files..."
OutputToHostAndLog $gap
# Delete all file items (i.e. all except folders) in source folder
$filesToDelete=Get-ChildItem $srcPath | Where-Object {$_ -is [IO.FileInfo]} | ForEach {
Remove-Item $_.FullName -Force
# Verify deletions
if(Test-Path($srcPath+"\"+$_)) {
OutputToHostAndLog ("Delete failed: "+$_.Name)
$fail++
}
else {
OutputToHostAndLog ($_.Name+" deleted successfully...")
}
}
}
这似乎可以正常工作,尽管我仍然不确定为什么这种安排会产生不同的结果。为了学习,任何见解都将不胜感激......
【问题讨论】:
-
我有一个类似的错误(PSv3)。我有一种预感,是脚本本身在维护锁定。您的原始脚本将文件存储在变量中(创建锁?)。第二个在存储到变量之前删除文件。我很难重新安排我的脚本来证明这一点。
标签: powershell powershell-2.0 powershell-ise