【发布时间】: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