2

Powershell を使用して REG_BINARY に値を書き込もうとしています。データを提供すれば REG_BINARY に書き込むことができますが、システム変数と日付変数を使用できるように、ファイルに書き込みたい内容をエンコードできる必要があります。以下は私のコードとエラーです。

最初の $data のコメントを外すと、機能します。

function Convert-ToCHexString 
{
    param ([String] $str) 
    $ans = ''
    [System.Text.Encoding]::ASCII.GetBytes($str) | % { $ans += "0x{0:x2}," -f $_ }
    return $ans.Trim(' ',',')
}

$Folder = Convert-ToCHexString Z:\
$Username = Convert-ToCHexString $env:USERNAME
$Filename = Convert-ToCHexString \archive.pst

$key = "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\0a0d020000000000c000000000000046"

#$data = 0x5a,0x3a,0x5c,0x61,0x72,0x63,0x68,0x69,0x76,0x65,0x2e,0x70,0x73,0x74
$data = $Folder + "," + $Username + "," + $Filename + ",0x00,0x00,0x00"

Set-ItemProperty -path $key -name "001f0324" -value ([byte[]]($data))

以下は私が得るエラーです:

値 "0x5a,0x3a,0x5c,0x6a,0x62,0x79,0x65,0x72,0x73,0x5c,0x61,0x72,0x63,0x68,0x69,0x76,0x65,0x2e,0x70,0x73,0x74,0x00,0x00, 0x00" を "System.Byte[]" と入力します。エラー: "値を変換できません" 0x5a,0x3a,0x5c,0x6a,0x62,0x79,0x65,0x72,0x73,0x5c,0x61,0x72,0x63,0x68,0x69,0x76,0x65,0x2e,0x70,0x73,0x74,0x00 ,0x00,0x00" を "System.Byte" と入力します。エラー: "追加の解析不能文字が文字列の末尾にあります。""

4

2 に答える 2

0

関数Convert-ToCHexStringは、アイテムをカンマで区切った単一の文字列を返します。

実行するキャスト ( [byte[]]($data)) は、文字列に 16 進値が 1 つしか含まれていないか、この方法で解析できる値の配列である場合にのみ機能します。文字列を分割しません。

ただし、GetBytes関数は既にバイト配列を返しているため、文字列に変換してから再度戻す必要はありません。また、あなたのコメントに基づいて、Outlook はこれらの値を Unicode (UTF-16) としてエンコードすることを望んでいるように見えますが、これは Windows のデフォルトであるため驚くべきことではありません。また、バイト配列を null で終了する必要があります (outlook から表示される最後の 2 つの 0)。これにより、関数は次のようになります。

function Convert-ToCHexString 
{
    param ([String] $str) 
    $ans = ''
    [System.Text.Encoding]::Unicode.GetBytes($str + "`0")
}
于 2013-08-07T00:54:21.580 に答える
0

プロパティがバイト配列を想定している場合は、 を使用します[Text.Encoding]::Unicode.GetBytes($data)。末尾の 0x00,0x00,0x00 がどうなっているのかわかりませんが、必要な場合は、Set-ItemProperty に渡す前に、バイト配列の末尾に 3 つの 0 を追加するだけです。

于 2013-08-07T00:41:35.227 に答える