PowerShell - конвертировать FileTime в HexString - PullRequest
0 голосов
/ 22 ноября 2018

После поиска по сетям мне удалось создать класс C # для получения шестнадцатеричной строки FileTimeUTC.

public class HexHelper
{
    public static string GetUTCFileTimeAsHexString()
    {
        string sHEX = "";

        long ftLong = DateTime.Now.ToFileTimeUtc();
        int ftHigh = (int)(ftLong >> 32);
        int ftLow = (int)ftLong;
        sHEX = ftHigh.ToString("X") + ":" + ftLow.ToString("X");

        return sHEX;
    }
}

Для PowerShell я пытался использовать этот код:

$HH = @"
public class HexHelper
{
    public static string GetUTCFileTimeAsHexString()
    {
        string sHEX = "";

        long ftLong = DateTime.Now.ToFileTimeUtc();
        int ftHigh = (int)(ftLong >> 32);
        int ftLow = (int)ftLong;
        sHEX = ftHigh.ToString("X") + ":" + ftLow.ToString("X");

        return sHEX;
    }
}
"@;

Add-Type -TypeDefinition $HH;
$HexString = [HexHelper]::GetUTCFileTimeAsHexString();
$HexString;

Проблема в том, что я получаю несколько сообщений об ошибках:

The name 'DateTime' does not exist in the current context

+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand

Add-Type : Cannot add type. Compilation errors occurred.

+ CategoryInfo          : InvalidData: (:) [Add-Type], InvalidOperationException
+ FullyQualifiedErrorId : COMPILER_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand

Я не знаю, как сделать этот код C # действительным для PowerShell и хотел бы получить рабочее решение.Я не знаю, почему PowerShell не может распознать класс DateTime в моем фрагменте C #.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Мой ответ здесь технически не является ответом на ваш вопрос, поскольку он не решает вашу техническую проблему (которую вы уже решили самостоятельно).

Однако вам может быть интересно узнать, что желаемыйрезультат может быть достигнут с помощью того, что по сути является однострочником Powershell:

function GetUTCFileTimeAsHexString
{
    return `
        (Get-Date).ToFileTimeUtc() `
        | % { "{0:X8}:{1:X8}" -f (($_ -shr 32) -band 0xFFFFFFFFL), ($_ -band 0xFFFFFFFFL) }
}

$HexString = GetUTCFileTimeAsHexString
$HexString;

Обратите внимание, что для этого требуется как минимум Powershell 3, в котором были введены операторы -shr и -band.

0 голосов
/ 22 ноября 2018

Оказывается, вам нужно включить директиву using.В данном случае «используя систему»;

$HH = @"
using System;

public class HexHelper
{
    public static string GetUTCFileTimeAsHexString()
    {
        string sHEX = "";

        long ftLong = DateTime.Now.ToFileTimeUtc();
        int ftHigh = (int)(ftLong >> 32);
        int ftLow = (int)ftLong;
        sHEX = ftHigh.ToString("X") + ":" + ftLow.ToString("X");

        return sHEX;
    }
}
"@;

Add-Type -TypeDefinition $HH;
$HexString = [HexHelper]::GetUTCFileTimeAsHexString();
$HexString;
...