使用powershell删除替代数据流

问题描述 投票:0回答:2

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

powershell alternate-data-stream
2个回答
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)"
        }
    }
}

1
投票

为什么不直接使用

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 可让您打开从以下位置下载的文件 互联网。它会解锁已下载的 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

© www.soinside.com 2019 - 2024. All rights reserved.