我正在尝试删除 NTFS 卷上的一堆 OSX 备用数据流。然而,无论我如何尝试,我都无法让 Powershell 执行此操作。是的,我承认我的powershell不太好。有人可以帮忙吗?
目标:从卷中的任何目录中删除ADS“AFP_AfpInfo”。
当前代码:
Get-ChildItem E:\ -Directory -Recurse | ForEach-Object {
$streams = Get-Content -Path $_ -Stream AFP_AfpInfo -ErrorAction SilentlyContinue
if ($streams) {
$streams | ForEach-Object {
try {
Remove-Item -Path "$($_.PSPath)" -Stream AFP_AfpInfo -Recurse -Force -ErrorAction Silentlycontinue
}
catch {
Write-Host "An error occurred: $($_.Exception.Message)"
}
}
}
}
当前错误:
An error occurred: A parameter cannot be found that matches parameter name 'Stream'.
注意:运行Powershell 7.3
-Recurse
和 -Stream
似乎并不在一起,即使在文档中它们出现在相同的 参数集 中。在这种情况下,应删除 -Recurse
。 GitHub 问题 #9822 已提交,以向 Remove-Item
文档添加说明。
此外,您正在寻找精确的流,
AFP_AfpInfo
,因此无需枚举 $streams
,并且检查文件或文件夹是否具有替代流应使用 Get-Item
而不是Get-Content
让您的代码更加高效。
最后,要解决此问题,您可以使用 EngineIntrinsics
中的
.Remove
方法,因为 Remove-Item -Confirm:$false -Force
将 always 要求对文件夹进行确认,这 可以说是一个错误。 cmdlet 应跳过确认检查如果 -Stream
与-Confirm:$false -Force
,GitHub 问题 #19154 已提交以跟进此问题。
$removeFunc = $ExecutionContext.InvokeProvider.Item.Remove
$targetStream = 'AFP_AfpInfo'
Get-ChildItem E:\ -Recurse -Directory | ForEach-Object {
if ($stream = $_ | Get-Item -Stream $targetStream -ErrorAction SilentlyContinue) {
try {
$removeFunc.Invoke($stream.PSPath, $false, $true, $true)
}
catch {
Write-Host "An error occurred: $($_.Exception.Message)"
}
}
}
为什么不直接使用
Unblock-File
cmdlet 来删除 ADS?
说明此 cmdlet 仅适用于 Windows 和 macOS 平台。
Unblock-File cmdlet 可让您打开从以下位置下载的文件 互联网。它会解锁已下载的 PowerShell 脚本文件 来自互联网,因此您可以运行它们,即使 PowerShell 执行策略是 RemoteSigned。默认情况下,这些文件被阻止 保护计算机免受不受信任文件的侵害。
在使用 Unblock-File cmdlet 之前,请检查文件及其来源 并验证是否可以安全打开。
在内部,Unblock-File cmdlet 删除 Zone.Identifier 备用数据流,其值为 3 表示它是 从网上下载的。
Get-Help -Name Unblock-FIle -Examples
NAME
Unblock-File
SYNOPSIS
Unblocks files that were downloaded from the internet.
------------------ Example 1: Unblock a file ------------------
PS C:\> Unblock-File -Path C:\Users\User01\Documents\Downloads\PowerShellTips.chm
-------------- Example 2: Unblock multiple files --------------
PS C:\> dir C:\Downloads\*PowerShell* | Unblock-File
------------- Example 3: Find and unblock scripts -------------
PS C:\> Get-Item * -Stream "Zone.Identifier" -ErrorAction SilentlyContinue
FileName: C:\ps-test\Start-ActivityTracker.ps1
另请参阅
Get-Item
、Clear-Content
和 Remove-Item
cmdlet 用例:
PowerShell 和备用数据流的周五乐趣 https://jdhisolutions.com/blog/scripting/8888/friday-fun-with-powershell-and-alternate-data-streams
您也可以使用 MSSysinternals 工具在 PS 代码中删除 ADS。
https://learn.microsoft.com/en-us/sysinternals/downloads/streams