Как получить фактический размер на диске файла от PowerShell?

Я считаю, что cherio.load (тело) дает вам DOM. Если это так, вы можете использовать innerText примерно так:

    // Parse the document body
    var $ = cheerio.load(body);
    console.log($('body').innerText);

Если cherio предоставляет вам HTML, вы можете преобразовать его в DOM с помощью JSDOM примерно так: :

    // Parse the document body
    const jsdom = require(jsdom);
    const dom = jsdom.JSDOM(cheerio.load(body),{"url": pageToVisit}).window.document.body;
    console.log(dom.innerText);

8
задан Jay Bazuzi 16 February 2009 в 18:22
поделиться

5 ответов

(редактирование)

Я выяснил, как динамично добавить свойство (названный "свойством сценария") к Fileobject, поэтому теперь, я могу использовать синтаксис: $theFileObject. CompressedSize для чтения размера.

(конец редактирования)

Ответ Read Goyuix, и я думал "Спокойный, но не являюсь там некоторой дополнительной типом возможностью в Powershell?". Таким образом я нашел это сообщение Scott Hanselman: http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx

И я создал Свойство Сценария для объекта FileInfo: CompressedSize.

Вот то, что я сделал: (отметьте: я довольно плохо знаком с Powershell, или по крайней мере я не использую его очень. Это могло, вероятно, быть сделано намного лучше, но здесь - то, что я сделал:

Во-первых, я скомпилировал Ntfs. ExtendedFileInfo из сообщения Goyuix. Я поместил DLL в свой каталог профиля Powershell (Documents\WindowsPowershell)

Затем, я создал файл в своем каталоге профиля под названием Мой. Типы 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 к объектам FileInfo, которые возвращаются get-childitem/dir. Но Powershell еще не знает о коде, и он еще не знает о моем DLL. Мы обрабатываем это на следующем шаге:

Профиль ps1 редактирования. в том же каталоге. Теперь, мой файл Профиля, оказывается, уже имеет некоторый материал в нем, потому что у меня есть Общественные Расширения для установленного powershell. Хотелось бы надеяться, я включаю все, в чем Вы нуждаетесь в этом следующем фрагменте кода, так, чтобы он работал даже над машиной, которая не имеет расширений. Добавьте следующий код для Профилирования:

#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, на которую я ссылаюсь, определяется ранее в моем сценарии Профиля ps1. На всякий случай это не находится в Вашем, вот определение:

$ProfileDir = split-path $MyInvocation.MyCommand.Path -Parent

Именно. В следующий раз, когда Вы выполняете Powershell, можно получить доступ к свойству CompressedSize на объекте FileInfo, как если бы это - любое другое свойство. Пример:

$myFile = dir c:\temp\myfile.txt

$myFile. CompressedSize

Это работает (на моей машине, так или иначе), но я хотел бы услышать, согласуется ли она с лучшими практиками. Одна вещь я знаю, что делаю неправильно: в файле Профиля ps1 я возвращаю результаты LoadFile в переменную, которую я не собираюсь использовать ($null = и тому подобное). Я сделал это для подавления дисплея результата файла загрузки к консоли. Существует, вероятно, лучший способ сделать это.

9
ответ дан 5 December 2019 в 06:39
поделиться

Загрузите Управляемый Windows API (http://mwinapi.sourceforge.net/) и проверьте класс ExtendedFileInfo. Существует метод GetPhysicalFileSize (), который возвратит размер, которого файл требует на диске.

public static ulong GetPhysicalFileSize(string filename)

Aternatively, Вы могли скомпилировать свой собственный DLL и загрузить блок для той одной функции:

using System;
using System.Runtime.InteropServices;

namespace NTFS {
  public class ExtendedFileInfo
  {
    [DllImport("kernel32.dll", SetLastError=true, EntryPoint="GetCompressedFileSize")]
    static extern uint GetCompressedFileSizeAPI(string lpFileName, out uint lpFileSizeHigh);
    public static ulong GetCompressedFileSize(string filename)
    {
      uint high;
      uint low;
      low = GetCompressedFileSizeAPI(filename, out high);
      int error = Marshal.GetLastWin32Error();
      if (high == 0 && low == 0xFFFFFFFF && error != 0)
      {
        throw new System.ComponentModel.Win32Exception(error);
      }
      else
      {
        return ((ulong)high << 32) + low;
      }
    }
  }
}

Затем скомпилировать:

csc /target:library /out:ntfs.extendedfileinfo.dll ntfs.extendedfileinfo.cs 

И наконец, чтобы загрузиться и работать в PowerShell:

PS C:\> [System.Reflection.Assembly]::LoadFile("C:\ntfs.extendedfileinfo.dll")
PS C:\> [NTFS.ExtendedFileInfo]::GetCompressedFileSize("C:\sample.txt")
8
ответ дан 5 December 2019 в 06:39
поделиться

Если Вы не можете найти управляемый API, Вам нравится в PowerShell V2, это намного легче к P/Invoke API Win32. Прочитайте Пошаговую демонстрацию PowerShell P/Invoke для инструкций.

2
ответ дан 5 December 2019 в 06:39
поделиться

Легкий сделать использование Добавлять-тип V2 и Pinvoke.NET:

add-type -type  @'
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace Win32Functions
{
    public class ExtendedFileInfo
    {
        [DllImport("kernel32.dll", SetLastError=true, EntryPoint="GetCompressedFileSize")]
        static extern uint GetCompressedFileSizeAPI(string lpFileName, out uint lpFileSizeHigh);

        public static ulong GetCompressedFileSize(string filename)
        {
            uint high;
            uint low;
            low = GetCompressedFileSizeAPI(filename, out high);
            int error = Marshal.GetLastWin32Error();
            if (high == 0 && low == 0xFFFFFFFF && error != 0)
            throw new Win32Exception(error);
            else
            return ((ulong)high << 32) + low;
        }
    }
}
'@

[Win32Functions.ExtendedFileInfo]::GetCompressedFileSize( "C:\autoexec.bat")

Экспериментируйте!Приятного отдыха! Участвуйте!

Jeffrey Snover [MSFT] Посещение Архитектора Windows Management Partner Команда Windows PowerShell ведет блог в: Посещение http://blogs.msdn.com/PowerShell Windows PowerShell ScriptCenter в: http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

5
ответ дан 5 December 2019 в 06:39
поделиться

$ s = (compact / q C: \ Any.dat | где-объект {$ _. Contains ('total bytes')}). Split ()}; $ s [8 ] .padleft (20) + $ s [0] .padleft (20)

0
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: