(编辑)
我想出了如何为 Fileobject 动态添加一个属性(称为“脚本属性”),所以现在我可以使用语法:$theFileObject.CompressedSize 来读取大小。
(编辑结束)
阅读 Goyuix 的回复,我想“很酷,但 Powershell 中没有某种类型扩展功能吗?”。于是我发现了这个 Scott Hanselman 的帖子:http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx
我为 FileInfo 对象创建了一个脚本属性:CompressedSize。
这是我所做的:(注意:我对 Powershell 还很陌生,或者至少我不怎么使用它。这可能会变得更好,但这是我所做的:
首先,我从 Goyuix 的帖子中编译了 Ntfs.ExtendedFileInfo。我将 DLL 放在我的 Powershell 配置文件目录 (Documents\WindowsPowershell)
接下来,我在我的配置文件目录中创建了一个名为 My.Types.ps1xml 的文件。
我将以下 XML 放入文件中:
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>CompressedSize</Name>
<GetScriptBlock>
[Ntfs.ExtendedFileInfo]::GetCompressedFileSize($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
该代码(一旦合并到类型系统中)将动态地将名为 CompressedSize 的属性添加到由 get-childitem/dir 返回的 FileInfo 对象。但是 Powershell 还不知道代码,也不知道我的 DLL。我们在下一步中处理它:
编辑 Profile.ps1。在同一目录中。现在,我的个人资料文件中恰好已经有一些东西,因为我安装了 Powershell 的社区扩展。希望我在下一个代码 sn-p 中包含了您需要的所有内容,以便它甚至可以在没有扩展的机器上工作。将以下代码添加到 Profile.ps1:
#This will load the ExtendedfileInfo assembly to enable the GetCompressedFileSize method. this method is used by the
#PSCompressedSize Script Property attached to the FileInfo object.
$null = [System.Reflection.Assembly]::LoadFile("$ProfileDir\ntfs.extendedfileinfo.dll")
#merge in my extended types
$profileTypes = $ProfileDir | join-path -childpath "My.Types.ps1xml"
Update-TypeData $profileTypes
现在,我引用的 $ProfileDir 变量已在前面的 Profile.ps1 脚本中定义。以防万一它不在你的,这里是定义:
$ProfileDir = split-path $MyInvocation.MyCommand.Path -Parent
就是这样。下次运行 Powershell 时,您可以访问 FileInfo 对象上的 CompressedSize 属性,就像它是任何其他属性一样。
示例:
$myFile = 目录 c:\temp\myfile.txt
$myFile.CompressedSize
这可行(无论如何在我的机器上),但我很想知道它是否符合最佳实践。我知道我做错了一件事:在 Profile.ps1 文件中,我将 LoadFile 的结果返回到我不会使用的变量中 ($null = blah blah)。我这样做是为了抑制将加载文件的结果显示到控制台。可能有更好的方法。