gpt4 book ai didi

.net - 如何从PowerShell获取文件的实际磁盘大小?

转载 作者:行者123 更新时间:2023-12-04 04:54:35 24 4
gpt4 key购买 nike

我正在写一个管理脚本,我需要计算磁盘上文件的大小。

这些文件位于压缩的NTFS卷上。

我不能使用FileInfo.Length,因为那是文件大小,而不是磁盘上的大小。例如,如果我有一个100MB的文件,但是由于NTFS压缩它仅使用25MB,则我的脚本需要返回25MB。

有没有办法在Powershell中做到这一点?

(我知道Win32的GetCompressedFileSize()调用,但是我希望它已经在某种程度上被包装了。)

最佳答案

(编辑)

我想出了如何向Fileobject动态添加属性(称为“脚本属性”),因此现在可以使用以下语法:$ theFileObject.CompressedSize读取大小。

(编辑结束)

阅读Goyuix的回复,我想“很酷,但是Powershell中没有某种类型扩展功能吗?”。于是我找到了斯科特·汉瑟曼(Scott Hanselman)的这个帖子:http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx

我为FileInfo对象创建了一个Script属性: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>

该代码(一旦合并到类型系统中)将向get-childitem/dir返回的FileInfo对象动态添加一个名为CompressedSize的属性。但是Powershell尚不了解代码,并且也不了解我的DLL。我们将在下一步中处理:

编辑Profile.ps1。在同一目录中。现在,我的配置文件恰好已经包含了一些东西,因为我已经安装了Powershell社区扩展。希望在下一个代码片段中包含您需要的所有内容,以便即使在不具有扩展名的计算机上也可以使用。将以下代码添加到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)。我这样做是为了抑制将加载文件结果显示到控制台。可能有更好的方法可以做到这一点。

关于.net - 如何从PowerShell获取文件的实际磁盘大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/554010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com