Saya mencoba membuat skrip yang pertama kali memeriksa apakah ada kunci di registri, dan jika tidak; menciptakannya.

$path = "HKCU:\Software\Microsoft\Office\16.0\Common\Identity\"
$regkey = "Testkey"
$keyvalue = "0"

if ((Get-ItemProperty $path -Name $regkey -ea 0).$regkey) {
    "Property already exists"
} else {
    Set-ItemProperty -Path $path -Name $regkey -Value $keyvalue
    Write-Output "Created key."
}

Apa yang saya harapkan:

  • Saat menjalankan skrip, jika ada kunci dengan nama yang sama, skrip akan menampilkan "Properti sudah ada".
  • Saat menjalankan skrip, jika tidak ada kunci dengan nama yang sama, skrip akan membuat kunci dan menampilkan "Dibuat".

Apa yang terjadi:

  • Jika kuncinya ada, tetapi ketik DWORD, skrip hanya menampilkan "Dibuat". Jika saya terus menjalankan skrip beberapa kali, masih tertulis "Dibuat".
  • Jika saya menghapus kunci, dan membuatnya sebagai tipe SZ, skrip berfungsi seperti yang diharapkan.

Jadi pada dasarnya, untuk beberapa alasan, saya tidak dapat membuat kode skrip untuk juga menemukan kunci tipe DWORD.

1
Atheos 8 Agustus 2019, 11:31

1 menjawab

Jawaban Terbaik

Masalahnya adalah dengan cara Anda memeriksa keberadaan nilai registri. Anda mendapatkan nilainya, perluas datanya, lalu biarkan PowerShell mengevaluasi data dalam konteks boolean. Nilai numerik 0 dalam konteks tersebut bernilai $false, tetapi nilai string "0" bernilai $true karena merupakan string yang tidak kosong. Demikian juga nilai numerik bukan nol akan dievaluasi menjadi $true dan string "" akan dievaluasi menjadi $false.

Untuk memperbaiki masalah ini, Anda perlu memeriksa apakah pencarian registri benar-benar mengembalikan hasil yang tidak kosong:

if ((Get-ItemProperty $path -Name $regkey -EA 0).$regkey -ne $null) {
    "Property already exists"
} else {
    Set-ItemProperty -Path $path -Name $regkey -Value $keyvalue
    Write-Output "Created key."
}
0
Ansgar Wiechers 8 Agustus 2019, 09:00