使用powershell删除备用数据流

dxxyhpgq  于 2023-03-08  发布在  Shell
关注(0)|答案(2)|浏览(183)

我正在尝试删除一个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

qxgroojn

qxgroojn1#

-Recurse-Stream看起来并不一致,即使在文档中它们出现在相同的参数集中。在这种情况下,-Recurse应被删除。提交GitHub Issue #9822是为了向Remove-Item文档添加说明。
另外,您正在寻找一个确切的流AFP_AfpInfo,所以我认为没有必要枚举$streams。最后,为了提高效率,检查文件或文件夹是否有替代流应该使用Get-Item而不是Get-Content
最后,代码必须使用EngineIntrinsics中的.Remove方法才能工作,Remove-Item -Confirm:$false -Force总是要求确认文件夹,* 可以说是一个bug。* 如果-Stream正在使用中,则Remove-Item应该跳过确认检查,并且提交-Confirm:$false -Force是为了跟进这一点。

$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)"
        }
    }
}
vm0i2vca

vm0i2vca2#

为什么不直接使用Unblock-File cmdlet来删除ADS?
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/unblock-file?view=powershell-7.3
描述此cmdlet仅适用于Windows和macOS平台。
Unblock-File cmdlet允许你打开从Internet下载的文件。它取消阻止从Internet下载的PowerShell脚本文件,以便你可以运行这些文件,即使PowerShell执行策略为RemoteSigned。默认情况下,阻止这些文件以保护计算机免受不受信任文件的攻击。
在使用Unblock-File cmdlet之前,请查看文件及其源,并验证打开该文件是否安全。
在内部,Unblock-File cmdlet删除Zone.Identifier备用数据流*,该数据流的值为3,表示它是从Internet下载的。

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-ItemClear-ContentRemove-Item cmdlet用例:
使用PowerShell和备用数据流https://jdhitsolutions.com/blog/scripting/8888/friday-fun-with-powershell-and-alternate-data-streams的星期五乐趣
您也可以使用MSSysinternals工具在PS代码中删除ADS。
https://learn.microsoft.com/en-us/sysinternals/downloads/streams

相关问题