我有一个脚本可以在生产环境中移动文件,当前执行一个copy-item,然后执行test-path,如果test-path工作正常,则执行remove-item,类似于下面的内容:
if ($copySuccess -eq $true) {
$files = Get-ChildItem $fileDir -Filter $filePrefix*.*
$files | ForEach-Object {
if ($copySuccess -eq $true) {
Copy-Item $fileDir\$_ -Destination $destDir
if (!(Test-Path $destDir\$_)) {
$copySuccess = $false
}
}
}
}
这个方法让我感觉很舒服,因为测试路径可以保证文件在需要的位置,然后再删除它。
我计划重写部分脚本,我想知道如果使用带有catch错误的copy-item,我可以肯定如果没有看到错误,那么该文件肯定有被复制到目的地(不需要使用测试路径,因为我认为这会使它更快)。如下所示:
Get-ChildItem $fileDir -Filter $filePrefix*.* | ForEach {
if ($copySuccess -eq $true) {
try {
Copy-Item $fileDir\$_ -Destination $destDir -ErrorAction Stop
}
catch {
$copySuccess = $false
}
}
}
}
当然,如果有更好的方法,请告诉我(Powershell v5)。这种检查水平的原因是基础设施上经常出现网络问题,因此目前正在使用测试路径。
答案 0 :(得分:1)
ErrorAction
在这种情况下不起作用,因为:
ErrorAction
参数对终止错误没有影响(例如 缺少数据,无效参数或不足 权限),阻止命令成功完成。 [Source]
如果您想检查Copy-Item是否有效,您可以通过几种方式来确保这一点。
第一个是使用$?
变量:
错误和调试:最后的成功或失败状态 命令可以通过检查$?
来确定
Copy-Item $fileDir\$_ -Destination $destDir
if(-not $?) {
Write-Warning "Copy Failed"
}
另一种方法是使用-Passthru
参数,我们可以将结果捕获到变量中。请注意,只有在操作成功时才会填充此变量:
if(-not Copy-Item $fileDir\$_ -Destination $destDir -PassThru) {
Write-Warning "Copy Failed"
}