【发布时间】:2019-08-24 02:20:34
【问题描述】:
我在 Powershell 中使用文件系统对象来执行一些文件夹循环:假设有 oldFolder、currentFolder 和 newFolder,这就是过程:
- 删除旧文件夹
- 将当前文件夹移动到旧文件夹
- 将新文件夹移动到当前文件夹
在脚本中运行时,第 2 步或第 3 步随机抛出 CTL_E_PERMISSIONDENIED。 当脚本停止时,我重复最后一个命令并正确完成。
好像 MoveFolder 方法是半异步工作的。
ps:文件夹有子文件夹和很多文件
我尝试增加一些延迟,但不知道发生了什么我很不高兴。
$oldFolder = "D:\test\folder_OLD"
$curFolder = "D:\test\folder"
$newFolder = "D:\test\folder_NEW"
$fso = $fso = New-Object -ComObject scripting.filesystemobject
if (Test-Path $oldFolder) {$fso.DeleteFolder($oldFolder)}
if (Test-Path $curFolder) {$fso.MoveFolder($curFolder,$oldFolder)}
$fso.MoveFolder($newFolder,$curFolder)
【问题讨论】:
-
您是否尝试过使用纯 powershell 而不是将 wscript 与 PoSh 混合使用? [咧嘴]
-
令人惊讶和不幸的是,directory (folder) removal is inherently asynchronous on Windows 会导致间歇性、不可预测的故障。我怀疑这就是这里发生的事情;有关强大的自定义文件夹删除功能,请参阅stackoverflow.com/a/53561052/45375
-
@Lee_Dailey:问题归根结底是Windows API,PowerShell的
Remove-Item -Recurse和cmd.exe的rd /s同样受到影响。 -
@Lee_Dailey,是的,它只是间歇性地发生是问题的一部分;显然有关于尽快使 Windows API 同步的讨论:github.com/dotnet/corefx/issues/33603#issuecomment-466595889
标签: powershell filesystemobject