PowerShell - 将FileTime转换为HexString

C S*_*ner 7 c# string powershell hex filetime

在搜索了interwebs之后,我设法创建了一个C#类来获取FileTimeUTC Hex String.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于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;
Run Code Online (Sandbox Code Playgroud)

问题是我收到一些错误消息:

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
Run Code Online (Sandbox Code Playgroud)

我不知道如何让这个C#代码对PowerShell有效,并且想要一个有效的解决方案.我不知道为什么PowerShell无法识别我的C#片段中的DateTime类.

小智 7

我的回答在技术上不是你问题的答案,因为它没有解决你的技术问题(你已经自己解决了).

但是,您可能有兴趣知道基本上是Powershell单线程可以实现所需的结果:

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

$HexString = GetUTCFileTimeAsHexString
$HexString;
Run Code Online (Sandbox Code Playgroud)

请注意,这至少需要Powershell 3,它引入了-shr和-band运算符.


C S*_*ner 2

事实证明您需要包含 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;
Run Code Online (Sandbox Code Playgroud)