我正在尝试让PowerShell在Win2K8 R2中取消阻止文件。
有没有人有关于语法的指针?
答案 0 :(得分:47)
如果您使用的是PowerShell v3,则可以使用Unblock-File
cmdlet。
“阻塞”部分只是文件的备用数据流,名为“Zone.Identifier”。您可以使用输入重定向在CMD中显示它(但不能以其他方式访问CMD中的流):
H:\Downloads> more < test.exe:Zone.Identifier
[ZoneTransfer]
ZoneId=3
您可以在Windows Vista及更高版本上使用dir /r
找到它们:
2009-10-24 12:18 54.538.056 test.exe
24 test.exe:Zone.Identifier:$DATA
同样在CMD中,你可以通过覆盖它来轻松摆脱它(使用输出重定向,这一次):
echo.>myDownloadedFile.exe:Zone.Identifier
与完全相同与完全删除ADS相同,但在该资源管理器中工作不会再抱怨了。
在PowerShell中似乎没有原生支持处理ADS(如PowerShell Guy的博客here中所述。该文章还提供了一些如何在PowerShell中获取该功能的信息)。但是,你可以简单地调用cmd:
cmd /c "echo.>test.exe:Zone.Identifier"
这也适用于PowerShell。
另一种选择是Mark Russinovich的streams
实用程序,它允许您检查文件的ADS并删除它们。所以
streams -d myDownloadedFile.exe
也可以。
答案 1 :(得分:9)
PoshCode模块包含Set-DownloadFlag和Remove-DownloadFlag功能,这些功能与宣传的一样。 :)我刚刚将这篇文章提取到它自己的脚本贡献http://poshcode.org/1430中......如果你使用New-Type函数代替Add-Type(http://poshcode.org/720,它也适用于PowerShell 1 })
答案 2 :(得分:5)
Oneliner为所有儿童删除区域信息(受到已接受答案的启发)(正确引用)。
get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }
没有严格回答这个问题,只是想确定当我接下来提出这个问题时已经有了解决方案:)。
PS。适用于PS 2.0
答案 3 :(得分:3)
在这样的论坛中发布的新内容,这可能是一个古老的主题,但这里是您正在寻找的。 p>
get-item -Path "path to file(s)" -Stream "Zone.Identifier" -ErrorAction "SilentlyContinue"
这应该列出仅被阻止的文件。
Unblock-File -Path "Path to blocked file(s)"
这将取消阻止它们。
答案 4 :(得分:1)
使用 Streams.exe 删除备用文件流 看这篇文章:http://www.paraesthesia.com/archive/2010/05/19/unblocking-multiple-files-at-once.aspx
答案 5 :(得分:1)
我写了一个小函数,它使用Win32 API删除Zone.Identifier
NTFS备用数据流,这是Windows用来确定是否要阻止文件的。
.NET无法访问备用数据流,因此该函数使用称为平台调用的技术来调用本机Win32 API。与PowerShell的其他一些解决方案相比,它的好处是它支持PowerShell管道,因此您可以将文件路径或System.IO.FileInfo
对象列表传递给该函数。该函数也没有任何外部依赖关系,实际上删除了备用数据流,而不是删除它的内容。
http://andyarismendi.blogspot.com/2012/02/unblocking-files-with-powershell.html
答案 6 :(得分:1)
要取消阻止文件夹及其递归子文件夹(> = PowerShell v3),可以使用Get-ChildItem (gci) command:
Get-ChildItem "C:\Temp\" -recurse | Unblock-File
其中C:\Temp
是起始文件夹。
答案 7 :(得分:0)
我将不得不修改Mike的答案:如果$ _。FullName中有空格(例如“C:\ Program Files”中的空格),这将不起作用,因此,它必须是:
get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }
答案 8 :(得分:0)
我还没有看到任何答案似乎使用适当的powershell cmdlet来执行此操作。
在这里,我们可以在当前文件夹中找到包含zone.identifier:
的DLLGet-Item -Path .\*.dll -stream * | where {$_.Stream -eq "Zone.Identifier" }
这里我们只删除不需要的流,不像上面的一些答案可能会损坏其他流:
Remove-Item -Path .\*.dll -stream Zone.Identifier
答案 9 :(得分:0)
如果您使用的是PowerShell 3.0或更高版本, 取消阻止文件 PowerShell cmdlet应解决此问题,即使您在文件属性窗口中没有取消阻止按钮,也可以取消阻止该文件。
Unblock-File cmdlet允许您打开从Internet下载的文件。它取消阻止从Internet下载的Windows PowerShell脚本文件,以便您可以运行它们,即使Windows PowerShell执行策略是RemoteSigned也是如此。默认情况下,这些文件被阻止以保护计算机免受不受信任的文件的侵害。
只需打开powerShell窗口即可 并按照以下语法。要查找有关语法的更多信息,请转至here
示例:
unblock-file -path C:\Downloads\MyFileName.chm
Unblock file with PowerShell screen shot
警告:请勿取消阻止不安全的文件。
答案 10 :(得分:0)
如果您的服务器没有Powershell&gt; v3($ PSVersionTable.PSVersion.Major -ge 3)。然后使用好旧的可靠DOS:
for /f "tokens=*" %f in ('dir /b *.*') do echo.>"%f":Zone.Identifier
答案 11 :(得分:0)
您可以像这样搜索被阻止的文件:
get-item * -stream zone*
然后取消阻止文件,通过管道删除项目或通过“ rm”删除zone.identifier流:
get-item * -stream zone* | Remove-Item
如果您要进行递归搜索:
get-childitem -recurse | get-item -stream zone*
答案 12 :(得分:-2)