Microsoft MVPs inside





 MCSEboard.de – IT Pro Forum zu Windows Server 2008 R2 / 2008 / 2003 & Windows 7 / Vista / XP
Registrieren Hilfe Regeln Benutzerliste Suchen Heutige Beiträge Alle Foren als gelesen markieren

Windows Forum — Scripting


Alles zum Thema System Administration Scripting — Q & A zum Thema Scripting: Batch, VBS, WMI, PowerShell


Antwort
     
Themen-Optionen
Alt 20.01.2012, 12:04   #1
Newbie
 
Offline
Registriert seit: 11-2005
Beiträge: 43
Registry-Values hinzufügen

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...

Code:
# 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.
    Mit Zitat antworten
Alt 22.01.2012, 14:47   #2
Moderator
 
Offline
Registriert seit: 11-2002
Beiträge: 6.666
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:
Code:
$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

Signatur
www.powershellpraxis.de

Nec Cupias, Nec Metuas

    Mit Zitat antworten
Alt 31.01.2012, 22:49   #3
MCSEboard.de Partner
 
Benutzerbild von Dominik Britz
 
Offline
Registriert seit: 03-2010
Beiträge: 3
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.

Code:
$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"
		}
	 }
}
    Mit Zitat antworten
Antwort


Themen-Optionen


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Registry wert in System Variable hinzufügen tom2011 Windows Forum — Allgemein 1 14.07.2010 10:40
DWORD-Wert automatisch in registry hinzufügen klappt nicht HackiFCB Windows Forum — Allgemein 11 06.03.2009 13:00
Frage zu Registry Values in GPO catal82 Windows Server Forum 2 01.08.2007 14:36
Benutzer ohne Adminrechte in Registry für winexit.src hinzufügen piet1967 Windows Forum — Allgemein 1 16.04.2006 21:46
Registry Settings im "Silent Modus" hinzufügen? Schluml Windows Forum — LAN & WAN 2 23.03.2006 08:16


Alle Zeitangaben in MEZ/CET. Es ist jetzt 15:20 Uhr. Seite generiert in 0,028 Sekunden.

- Unsere Partner -

Copyright © 2000 – 2012 MCSEboard.de

Sprung zum Seitenanfang