【发布时间】:2016-07-14 13:15:59
【问题描述】:
我正在使用 Powershell 进行一些文件操作并执行以下步骤:
- 将文件从一个位置复制到另一个位置(复制项)
- 验证新文件是否在预期位置(测试路径)
- 如果在新位置验证,请移除原始 (remove-item)
此过程在 99.9% 的情况下都有效,但有时我会在删除项目步骤发生时收到错误消息,通知我原始文件已在使用/锁定。我只能假设使用它的过程是第 1 步或第 2 步中的复制项/测试路径。
我是否需要指示 Powershell 等到复制项/测试路径完成后再继续删除项?还是更有可能有另一个进程在其他地方运行,例如导致此问题的访问 AV?如果是这样,是否有一种方法可以在文件锁定到位时轻松重试?
这是执行上述步骤的部分代码:
if ($copySuccess = "TRUE") {
$wiFiles = Get-ChildItem $xmlDir -Filter $itemNum*.*
$wiFiles | ForEach-Object {
if ($copySuccess -eq "TRUE") {
Copy-Item -LiteralPath $xmlDir\$_ -Destination $processedDir
if (!(Test-Path -LiteralPath $processedDir\$_)) {
$copySuccess = "FALSE"
}
}
}
}
if ($copySuccess -eq "TRUE") {
Get-ChildItem $xmlDir -Filter $itemNum*.* | Remove-Item
}
要移动的文件是小于 1MB 的小型文本文件或图像文件,通常每个 itemNum 小于 10 个文件。
谢谢,罗伯。
【问题讨论】:
-
脚本本身在哪里?我们至少需要看到一个minimal reproducible example 才能验证为什么文件可能会被锁定。
-
Copy-Item是同步的,所以它不太可能是罪魁祸首。扫描文件系统的 AV 或其他软件(如果它位于 google drive/dropbox/skydrive 文件夹中,可能是索引器、同步软件)更有可能。要确定你必须做什么,你必须弄清楚是什么锁定了它。
标签: powershell