Alsion 10 Geschrieben 20. Januar 2012 Melden Teilen Geschrieben 20. Januar 2012 Hallo zusammen, ich sehe leider den Wald vor lauter Bäumen nicht... Ich habe ein Script das in der Registry überprüft ob es einen bestimmten Pfad und bestimmte Schlüssel gibt. Wenn es den Pfad oder Schlüssel nicht gibt werden sie angelegt. Funktioniert soweit problemlos. Wenn die Schlüssel schon da sind, sollen den Feldern (wenn sie leer sind) Werte übergeben werden. Wenn bereits was drin steht, sollen Werte *hinzugefügt* werden, der bisherige Inhalt muss also erhalten bleiben. Das ganze über zwei Arrays. Eins für die Schlüssel, eins für die Werte die den Schlüsseln zugeordnet werden sollen. Nur das hinzufügen klappt nicht. Leider habe ich von der Powershell noch nicht wirklich viel Ahnung und tappe komplett im dunkeln... # Set parameters $pathVGOC="HKLM:\SOFTWARE\VGOC" $pathOPSMGR="HKLM:\SOFTWARE\VGOC\OperationsManager" $value="key1","key2","key3","key4","key5" $data="t1","t2","t3","t4","t5" # Function which can be called to add the values defined before function addValues { for ($i = 0; $i -lt $value.length ; $i++) { if (Get-ItemProperty -name $value[$i] -path $pathOPSMGR -erroraction silentlycontinue) { # Get current value $a = Get-ItemProperty $pathOPSMGR -name $value[$i] # Change value (adds the variable $value[$i]) $a.$value[$i] = $a.$value[$i] + ";" + $data[$i] # Write value Set-ItemProperty -name $value[$i] -path $pathOPSMGR $a.$value[$i] } else { New-ItemProperty $pathOPSMGR -name $value[$i] -value $data[$i] -propertytype "String" } } } if (Test-Path $pathVGOC) { Write-Host "Path exists:" $pathVGOC if (Test-Path $pathOPSMGR) { Write-Host "Path exists:" $pathOPSMGR addValues } else { New-Item –path $pathVGOC -name "OperationsManager" Write-Host "Path created:" $pathOPSMGR addValues } } else { New-Item –path "HKLM:\SOFTWARE" -name "Voith Group of Companies TEST" Write-Host "Path created:" $pathVGOC New-Item –path $pathVGOC -name "OperationsManager" Write-Host "Path created:" $pathOPSMGR addValues } Vielleicht mag das jemand mal testen, und zwar ZWEIMAL hintereinander. Beim ersten Mal werden die Werte im Pfad angelegt und die Werte geschrieben. Beim zweiten Mal sollten die Werte erweitert, also hinzugefügt werden, ohne dass die ersten überschrieben werden. (In dem Beispiel müsste also die Werte nach dem zweiten Durchlauf doppelt vorhanden sein. In der Realität kann es vorkommen, dass die Schlüssel einfach schon da sind und fremde Werte drin stehen, die auf jeden Fall erhalten bleiben müssen und nur durch die im Skript erweitert). Nachtrag: Das die Funktion einen Fehler produziert ist mir bewusst ;-) Ich habe nur keine Ahnung wie ich das angehen muss damit es funktioniert wie ich es mir vorstelle. Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 22. Januar 2012 Melden Teilen Geschrieben 22. Januar 2012 Hallo, So kann das nicht funktionieren: $a ist ein Hash. Mit $a.key1 kann man sich den zugehörigen Wert in der Hashtablle auslesen. Allerdings kannst du "key1" nicht, zumindest nicht direkt als Parameter übergeben. $a.$value[1] geht nicht Mit einem Scriptblock kann aber ein solches Konstrukt erreichen: Codefragment: $ScriptBlock={ $a.$args[0] = $args[0] + ";" } $value[1] | foreach{ $($ScriptBlock.Invoke($_)) } Im Skriptblock übergibst du den Wert $value[$i] an den Parameter $args[0] und der wird dann als Codetext interpretiert. Ich habe jetzt einige zeit versucht, deine Aufgabe zu lösen. So ganz geschafft habe ich es leider nicht. Vielleicht hilft dir der Ansatz oben weiter. blub Zitieren Link zu diesem Kommentar
Dominik Britz 10 Geschrieben 31. Januar 2012 Melden Teilen Geschrieben 31. Januar 2012 Hallo Alsion, wie Blub schon schreibt, ist hier ein Hashtable das Mittel der Wahl. Ich habe dir mal eine "Quick & Dirty Lösung" niedergeschrieben. Bei einem Hashtable wird einem Key ein Wert zugewiesen. Dieser Hashtable kann am besten mit einer foreach Schleife durchlaufen werden, diese ist speziell für Arrays und Hashtables gedacht. $path="HKCU:\Software\test" $hash=@{key1="value1"; key2="value2"; key3="value3"} foreach ($key in $hash.Keys) { If (Get-ItemProperty -Path $path -Name $key) { $RegValue = Get-ItemProperty -Path $path -Name $key $RegValue = $RegValue.$key If ($RegValue) { $HashValue = $hash.get_Item($key) Set-ItemProperty -Path $path -Name $key -Value "$RegValue;$HashValue" } Else { New-ItemProperty -Path $path -Name $key -Value "$HashValue" } } } Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.