【问题标题】:Powershell copy-item then test-path or copy-item with catch?Powershell复制项然后是测试路径或带有catch的复制项?
【发布时间】:2017-10-17 08:58:55
【问题描述】:

我有一个在生产环境中移动文件的脚本,当前执行一个复制项,然后是测试路径,如果测试路径正常,然后是删除项,类似于以下内容:

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
            }
        } 
    }
}

这种方法让我感觉很舒服,因为测试路径保证文件在删除之前就在它需要的位置。

我打算重写部分脚本,我想知道是否通过使用带有错误捕获的复制项,我可以确定如果没有看到错误,则文件肯定已复制到目的地(不需要使用测试路径,因为我认为这会更快)。如下:

Get-ChildItem $fileDir -Filter $filePrefix*.* | ForEach {
    if ($copySuccess -eq $true) {
        try {
            Copy-Item $fileDir\$_ -Destination $destDir -ErrorAction Stop
            }
        catch {
              $copySuccess = $false
              } 
        }
    }
}

当然,如果有更好的方法,请告诉我(Powershell v5)。进行这种级别检查的原因是基础架构上经常存在网络问题,因此是当前使用的测试路径。

【问题讨论】:

  • 第一个“if ($copySuccess = $true)”应该是“if ($copySuccess -eq $true)”或者更好:if ($copySuccess)
  • 啊,很好发现,这只是一个错字,它是-eq,但我很着急,而不是复制+粘贴。不过,关于 if($copySuccess) 的想法很好,谢谢。
  • 你为什么不使用Move-Item?
  • 由于基础设施可能是“临时性的”,我总是选择先复制,然后检查它是否在目标中,然后再使用 remove-item。以防万一在移动过程中发生连接问题。正如我所说,也许这有点矫枉过正,非常感谢引导一个更好的方式,或者如果 move-item 永远不会丢失文件并且可以使用。
  • @RobBerry 想一想,“移动项目” 是什么。它正在复制,然后删除一个项目。写不出来,为什么要在目标上去掉?

标签: powershell


【解决方案1】:

ErrorAction 在这种情况下不起作用,因为:

ErrorAction 参数对终止错误没有影响(例如 数据缺失、参数无效或不足 权限)阻止命令成功完成。 [Source]

如果您想检查 Copy-Item 是否有效,您可以通过多种方式进行确认。

第一个是使用$?变量:

Errors and Debugging:上一次的成功或失败状态 命令可以通过检查 $? 来确定

Copy-Item $fileDir\$_ -Destination $destDir
if(-not $?) {
    Write-Warning "Copy Failed"
}

另一种方法是使用-Passthru 参数,我们可以将结果捕获到变量中。请注意,只有在操作成功时才​​会填充此变量:

if(-not Copy-Item $fileDir\$_ -Destination $destDir -PassThru) {
    Write-Warning "Copy Failed"
} 

【讨论】:

  • 感谢您的意见,我不知道这些其他选项。我假设第一种方法是首选(并且可能比测试路径更快)?我现在就试一试。
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多