我可以创建一个名称中带有冒号的文件:
。据我所知,这在 Windows 中是不可能实现的。我最初是通过将带有冒号的文本复制:
到文件名中,以使用 Notepad++ 保存文本文件来实现的。如果我知道确切的名称,我可以使用 Notepad++ 打开该文件。有一个文件的名称与冒号前的文本相同,:
属性显示大小为 0 字节,但如果保存时没有冒号,则磁盘上的大小似乎与文件的大小相同:
。
我使用 PowerShellSet-Content
进行了复现Get-Content
。
Set-Content -Path .\test:test.txt -Value "colon filename test"
Get-Content -Path .\test:test.txt
返回:
colon filename test
请注意,这个小文件在磁盘上显示 0 字节,与从 Notepad++ 保存的较大的 44 kb 文件不同。
Get-ChildItem
仅显示长度为 0 的伪文件夹。
Remove-Item -Path .\test:test.txt
可以工作,但伪文件夹仍然存在。
还必须使用 将其删除Remove-Item -Path .\test
。
我正在运行 Windows 10 和 PowerShell 5.1。
答案1
这并不是什么新鲜事,与 Powershell 无关。
您的职位:
“我可以创建一个名称中带有冒号 : 的文件,这在 Windows 中是不可能的。”
...无效。
几十年来,Windows 一直可以做到这一点。它被称为 ADS(备用数据流),这不是一个文件夹,而只是嵌入/附加/隐藏在数据文件中的额外数据(文本、图片等)。这是有据可查的。根据设计,ADS 永远不会增加原始文件的大小。
这也是一种安全的东西,叫做隐写术,是的,当您使用这样的技术时,您需要确切地知道流名称是什么。
只需搜索“Windows 备用数据流”或者‘Windows 备用数据流视图’并且你会得到很多关于它是什么、为什么存在、如何做以及如何阅读它们的信息。
您可以使用名为 streams.exe 的 Microsoft SysInternals 工具去看看它们。
https://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams
您也可以搜索PowerShell 读取“备用数据流”看看如何阅读它们。
最后,关于这个……
“Remove-Item -Path .\test:test.txt 有效,但伪文件夹仍然存在。”
... 这也是无效的。当您删除主文件时,与其关联的所有内容都将被删除,因为它的存在只是因为主文件存在。
删除 ADS 和删除整个文件是有区别的。
$TargetPath = 'D:\Test\ADSStuff'
Set-Content -Path "$TargetPath\test:test.txt" -Value "colon filename test"
Get-ChildItem -Path $TargetPath -Recurse
Get-Content -Path "$TargetPath\test:test.txt"
# colon filename test
Remove-Item "$TargetPath\test" -Force
Get-ChildItem -Path $TargetPath -Recurse
Get-Content -Path "$TargetPath\test:test.txt"
<#
Get-Content : Cannot find path 'D:\Test\ADSStuff\test:test.txt' because it does not exist.
At line:1 char:1
+ Get-Content -Path "$TargetPath\test:test.txt"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (D:\Test\ADSStuff\test:test.txt:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
#>