|
<# ::
|
|
@REM shebang4powershell.bat - shebang for PowerShell by Batch file.
|
|
@REM Copyright 2022 (c) Koichi OKADA. All rights reserved.
|
|
@REM This script is destributed under the MIT license.
|
|
@REM References:
|
|
@REM https://qiita.com/earthdiver1/items/cab769aad623a03a0f2d
|
|
@REM https://stackoverflow.com/q/2609985
|
|
@
|
|
@SETLOCAL
|
|
@SET ARGS=%*
|
|
@IF DEFINED ARGS SET ARGS=%ARGS:"=\"%
|
|
@SET INIT=echo """"`$PSCommandPath=`'%~f0`';`$PSScriptRoot=`'%~dp0`'.TrimEnd(`'\`');""""
|
|
@powershell -Command "&([scriptblock]::Create((&{%INIT%;gc '%~f0'|Out-String})))" %ARGS%
|
|
@EXIT /B %ERRORLEVEL%
|
|
#>
|
|
|
|
# SFC-SetFace.bat
|
|
# Copyright 2023 (c) Koichi OKADA. All rights reserved.
|
|
# This script is destributed under the MIT license.
|
|
|
|
function timebak {param($src)
|
|
$src = ls $src
|
|
$dst = "$($src.Directory)\$($src.Name),$($src.LastWriteTime.ToString("yyyyMMdd_HHmmss"))$($src.Extension)"
|
|
if (-not (Test-Path $dst)) {
|
|
cp $src $dst
|
|
}
|
|
}
|
|
|
|
function indexof {param ([Byte[]] $b1,[Byte[]] $b2)
|
|
$s1 = [System.BitConverter]::ToString($b1) + "-"
|
|
$s2 = [System.BitConverter]::ToString($b2) + "-"
|
|
$i = $s1.IndexOf($s2)
|
|
if (0 -lt $i) {$i = $i / 3}
|
|
return $i
|
|
}
|
|
|
|
if ( $args.count -ne 2) {
|
|
[Console]::Error.WriteLine("Usage: $((ls $PSCommandPath).Name) <ShortcutFile> <FontFace>`n")
|
|
exit 1
|
|
}
|
|
|
|
if ( $src = ls $args[0] ) {} else {
|
|
[Console]::Error.WriteLine("Error: File not exist: $($args[0])")
|
|
exit 1
|
|
}
|
|
|
|
$face_raw = $args[1]
|
|
|
|
$face_idx = 44
|
|
$face_len = 64
|
|
|
|
$size = [System.BitConverter]::GetBytes([Int32] 76)
|
|
$guid = [System.GUID]::Parse("{00021401-0000-0000-c000-000000000046}").ToByteArray()
|
|
$sig = [Byte[]] @(0xcc,0x00,0x00,0x00,0x02,0x00,0x00,0xa0) # 0x000000cc, 0xa0000002
|
|
$data = [System.IO.File]::ReadAllBytes($src)
|
|
$face = [System.Text.Encoding]::Unicode.GetBytes($face_raw)
|
|
|
|
if ($face_len -lt $face.length) {
|
|
[Console]::Error.WriteLine("Error: font_face is too long: `"{$face_raw}`"")
|
|
[Console]::Error.WriteLine(" Unicode length is $($face.length). It must be <= 64.")
|
|
exit 1
|
|
}
|
|
|
|
if ( (indexof $data $size + $guid) -lt 0 ) {
|
|
[Console]::Error.WriteLine("Error: File is not shortcut file: {$src}")
|
|
exit 1
|
|
}
|
|
|
|
$p = indexof $data $sig
|
|
|
|
if ( $p -lt 0 )
|
|
{
|
|
[Console]::Error.WriteLine("Error: The console properties data block is not found: {$src}")
|
|
exit 1
|
|
}
|
|
|
|
$p1 = ($p+$face_idx)
|
|
$p2 = ($p+$face_idx+$face_len-1)
|
|
$l = $face.length
|
|
|
|
for ($i = $p1; $i -le $p2; $i++) {
|
|
$data[$i] = 0
|
|
}
|
|
for ($i = 0; $i -lt $l; $i++) {
|
|
$data[$p1+$i] = $face[$i]
|
|
}
|
|
|
|
timebak $src
|
|
[System.IO.File]::WriteAllBytes($src, $data)
|