使用PowerShell来以官方名称导出Minecraft资源

首先

Minecraft将默认资源保存为哈希名称。它使用JSON文件将其与实际资源名进行关联。

{"objects": 
    {
        "resource1.png": 
            {"hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "size": 1234},
        "resource2.png": 
            {"hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "size": 5678}
    }
}

以这种方式将哈希值与资源名称关联起来。这是试图将其作为资源名称进行导出的尝试。

适应环境

我确认了Minecraft 1.16和PowerShell 5.1是可以运行的。另外,我认为在开源版的PowerShell上也可以执行。

我只做了最基本的验证。

实际的代码

$objects_dir = "C:\Users\Owner\AppData\Roaming\.minecraft\assets\objects"; # .minecraftフォルダ内のassets/objectsまでのフルパス
$listjson = "C:\Users\Owner\AppData\Roaming\.minecraft\assets\indexes\1.16.json" # .minecraftフォルダ内のassets/indexes内の任意のバージョン名のJSONファイルまでのフルパス

$exportdir = "C:\Users\Owner\AppData\Roaming\.minecraft\assets\extracted" # エクスポート先フォルダのフルパス

# ===================

$json = Get-Content $listjson
$list = ConvertFrom-Json -InputObject $json


foreach ($r in $list.objects.psobject.Properties) { 
    $fname = $r.Name
    $afname = $list.objects.$fname.hash

    $hash_dirname = $afname.Substring(0, 2);

    $from = $objects_dir + '\' + $hash_dirname + '\' + $afname;
    $to = $exportdir + '\' + $fname;

    $destdir = Split-Path $to -Parent;

    if (!(Test-Path -Path $destdir)) { $0_ = New-Item $destdir -Type Directory }
    Copy-Item -Path $from -Destination $to
}

虽然这段代码很乱,但基本上是这个样子。请重写并使用前三行(包括换行,共四行)。

重点注意事项和详细解释

就如前面所述,这个列表是由JSON创建的。因此,我们可以通过ConvertFrom-Json很容易地进行加载。然而,有一些要注意的问题。

在PowerShell 5.1中,无法将JSON转换为Hashtable。

在Windows 10中内置的PowerShell不支持-AsHashtable选项。因此,无法直接获取以PSCustomObject输出的对象名称。
为了解决这个问题,使用foreach循环中的psobject.Properties来获得想要的对象,并将属性数据传递给foreach。
通过这样做,我们可以直接嵌入获取的对象名称,并使用$list.objects.$fname.hash来获取以PSCustomObject形式的数据。

在复制文件时,找不到父目录。

PowerShell的Copy-Item命令无法自动创建父目录。因此,通过使用Split-Path $to -Parent命令获取父目录,并在目录不存在的情况下进行创建。

创建目录时的日志

使用New-Item命令,可以在运行时输出目录的详细数据作为结果。然而,由于本次情境只会干扰操作,所以通过将结果分配给$0变量来消除显示。

广告
将在 10 秒后关闭
bannerAds