首页 > 解决方案 > 在 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

这也完全有道理,因为它在使用中,它不能被删除。但是为什么它一直工作到现在。

我很困惑。任何帮助表示赞赏:)

标签: powershellcommandscript

解决方案


您需要Set-Location( cd) 在您尝试删除的文件夹之外。如果该文件夹是其当前工作目录,则外壳将对该文件夹具有打开的句柄。

您不一定需要Set-Location从脚本中(尽管您可以),只是不要使用C:\Public\Folderset 作为工作目录来调用脚本。

如果您不在该文件夹中,则必须确定锁定文件夹的进程。我从未以编程方式完成此操作,但我通常使用的工具是LockHunter。如果你有Chocolatey,你可以很容易地安装它:

choco install lockhunter

附加阅读

我还没有尝试过这个,但好奇心终于让我在这个话题上得到了最好的结果,我找到了一个嘿,脚本专家!有关使用调用必要的 Win32 API 函数的文章P/Invoke,这些函数可以告诉您哪个进程正在锁定文件。您可能会发现这对阅读很有用。从文章中,看起来范围内的关键 Win32 API 函数是:

  • NtQuerySystemInformation:除其他外,可以查询系统上打开的句柄。

  • NtQueryObject:查询句柄的附加信息。

  • OpenProcess:允许我们获取有关拥有该句柄的进程的更多信息。

  • DuplicateHandle:在当前进程(例如 ISE)中创建句柄的副本,以便我们可以对其执行其他操作。

  • QueryDosDevice:将逻辑驱动器(如驱动器 C)转换为 DOS 设备标识符。


推荐阅读