powershell - 在 PowerShell 中使用 Remove-Item
问题描述
我知道有很多类似的问题,但我仍然没有找到答案。
我尝试删除里面有一些脚本的文件夹。
文件夹位于:C:\Public\Folder
文件夹内有 7 个脚本。
脚本 CopyFiles.ps1 将其中的 4 个复制到不同的位置。
复制后,它会删除文件夹本身以及所有其他文件。
脚本如下所示:
[string] $Path = "";
[string] $Destination = "";
# Copy the Folder
[string] $Destination = "C:\ProgramData\Path\To\Folder";
[string] $Path = "C:\Public\Folder";
Copy-Item -Path $Path -Destination $Destination
#Copy Files
[string[]] $Files = ("CreateUser.ps1", "RemoveFiles.ps1", "RemoveUser.ps1", "UpdateUser.ps1");
foreach($file in $Files)
{
$Script = $Path + "\" + $file
write-host $Script
Copy-Item -Path $Script -Destination $Destination
}
[string] $Path = "C:\Public";
Remove-Item -Path $Path -Include *UserManager* -Recurse -Force
到目前为止,这个脚本就像一个魅力。但今天没有。我收到以下错误消息:
Remove-Item :无法删除 'C:\Public' 中的项目,因为它正在使用中。在 C:\Public\Folder\CopyFiles.ps1:24 char:1
这也完全有道理,因为它在使用中,它不能被删除。但是为什么它一直工作到现在。
我很困惑。任何帮助表示赞赏:)
解决方案
您需要Set-Location
( cd
) 在您尝试删除的文件夹之外。如果该文件夹是其当前工作目录,则外壳将对该文件夹具有打开的句柄。
您不一定需要Set-Location
从脚本中(尽管您可以),只是不要使用C:\Public\Folder
set 作为工作目录来调用脚本。
如果您不在该文件夹中,则必须确定锁定文件夹的进程。我从未以编程方式完成此操作,但我通常使用的工具是LockHunter。如果你有Chocolatey,你可以很容易地安装它:
choco install lockhunter
附加阅读
我还没有尝试过这个,但好奇心终于让我在这个话题上得到了最好的结果,我找到了一个嘿,脚本专家!有关使用调用必要的 Win32 API 函数的文章P/Invoke
,这些函数可以告诉您哪个进程正在锁定文件。您可能会发现这对阅读很有用。从文章中,看起来范围内的关键 Win32 API 函数是:
NtQuerySystemInformation
:除其他外,可以查询系统上打开的句柄。NtQueryObject
:查询句柄的附加信息。OpenProcess
:允许我们获取有关拥有该句柄的进程的更多信息。DuplicateHandle
:在当前进程(例如 ISE)中创建句柄的副本,以便我们可以对其执行其他操作。QueryDosDevice
:将逻辑驱动器(如驱动器 C)转换为 DOS 设备标识符。
推荐阅读
- android - 在约束布局中编辑文本滚动条问题
- java - 无法在 JBehave 中具有共同生命周期步骤的不同故事之间共享 Web 驱动程序实例
- git - 在合并之前将 fix-commit 从一个分支移动到另一个分支
- api - 使用支持分页的 API 的设计模式
- java - 如果 C# 的原始类型以不同方式实现,性能差异?
- javascript - 无法在 webpack 配置中使用 ES6 导入
- node.js - 将我的 Localhost API 转移到 heroku 服务器
- ruby-on-rails - 如何在 Rails 视图中动态设置具有不同路径的搜索表单?
- r - 尝试使用 readr 函数读取 R 中的 .xz 文件时出错
- spring-boot - 项目 riff 错误 java.lang.IllegalStateException:无法创建函数