Powershell copy-item然后是带有catch的test-path或copy-item?

时间:2017-10-17 08:58:56

标签: powershell

我有一个脚本可以在生产环境中移动文件,当前执行一个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)。这种检查水平的原因是基础设施上经常出现网络问题,因此目前正在使用测试路径。

1 个答案:

答案 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"
}