使用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变量来消除显示。