Abfrage function und weitergabe der Parameter
Hallo zusammen,
bin leider noch blutiger anfänger im Bereich Powershell.
Zu meinem Problem:
Ich möchte ein Script schreiben, dass uns in der Firma das kopieren von benutzerkonten vereinfacht (z.B. Mitarbeiter erhält neues Laptop).
Da teilweise aber auch mehrere Benutzerkonten auf einem Rechner genutzt werden, soll später die Abfrage kommen, ob ein weiteres Benutzerkonto kopiert werden soll, oder nicht. Deswegen die arbeit mit "function".
#Definierte Funktionen
function Rechnerabfrage
{
#Abfrage des Hostnames des alten Rechners
$rechneralt = Read-Host "Name des bisheriger Rechners"
#Abfrage des Zielhosts (Neuer Rechner)
$rechnerneu = Read-Host "Name des neuen Rechners"
}
function Userabfrage
{
#Abfrage des zu kopierenden Benutzerkontos
$Username = Read-Host "Zu kopierendes Benutzerkonto eingeben"
}
#Generierte Pfade aus Abfrage "Rechner alt"
$PfadDesktopalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Desktop\"
$Pfadfavoritesalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Favorites\"
$Pfadlinksalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Links\"
usw.....
Leider setzt er die Variablen aus den Abfragen nicht unten in die Netzwerkpfade.
Was mache ich falsch?
als Ausgabe kommt dann:
\\\C$\Users\\Desktop\
usw...
Danke für eure Hilfe.
Grüße,
Complex
bin leider noch blutiger anfänger im Bereich Powershell.
Zu meinem Problem:
Ich möchte ein Script schreiben, dass uns in der Firma das kopieren von benutzerkonten vereinfacht (z.B. Mitarbeiter erhält neues Laptop).
Da teilweise aber auch mehrere Benutzerkonten auf einem Rechner genutzt werden, soll später die Abfrage kommen, ob ein weiteres Benutzerkonto kopiert werden soll, oder nicht. Deswegen die arbeit mit "function".
#Definierte Funktionen
function Rechnerabfrage
{
#Abfrage des Hostnames des alten Rechners
$rechneralt = Read-Host "Name des bisheriger Rechners"
#Abfrage des Zielhosts (Neuer Rechner)
$rechnerneu = Read-Host "Name des neuen Rechners"
}
function Userabfrage
{
#Abfrage des zu kopierenden Benutzerkontos
$Username = Read-Host "Zu kopierendes Benutzerkonto eingeben"
}
#Generierte Pfade aus Abfrage "Rechner alt"
$PfadDesktopalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Desktop\"
$Pfadfavoritesalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Favorites\"
$Pfadlinksalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Links\"
usw.....
Leider setzt er die Variablen aus den Abfragen nicht unten in die Netzwerkpfade.
Was mache ich falsch?
als Ausgabe kommt dann:
\\\C$\Users\\Desktop\
usw...
Danke für eure Hilfe.
Grüße,
Complex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 249183
Url: https://administrator.de/contentid/249183
Ausgedruckt am: 25.11.2024 um 07:11 Uhr
6 Kommentare
Neuester Kommentar
Moin,
Lese du dazu unbedingt dieses Kapitel zu Variable-Scopes durch: http://technet.microsoft.com/de-de/library/hh847849.aspx
2. Du rufst deine Funktionen ja garnicht auf ?! Zumindest sehe ich das hier in deinem Ausschnitt nicht.
Also entweder definiere vorher außerhalb der Functions Scriptvariablen in dieser Art
und setze den Inhalt der Scriptvariablen in der Function:
Beispiel mit Scriptvariablen
oder du verwendest die Function dafür wofür sie eigentlich gedacht ist, zur Rückgabe von Werten. Dafür gibt es in Funktionen das Statement return $variable
Beispiel mit Rückgabe von Werten aus der Funktion als Hashtable
Grüße Uwe
p.s. Bitte nutze Code-Tags für deinen Quellcode:
Leider setzt er die Variablen aus den Abfragen nicht unten in die Netzwerkpfade.
Was mache ich falsch?
1. weil du die Variablen erst in den Funktionen verwendest, und dort sind sie dann nur lokal in der Funktion definiert und außerhalb dieser nicht mehr.Was mache ich falsch?
Lese du dazu unbedingt dieses Kapitel zu Variable-Scopes durch: http://technet.microsoft.com/de-de/library/hh847849.aspx
2. Du rufst deine Funktionen ja garnicht auf ?! Zumindest sehe ich das hier in deinem Ausschnitt nicht.
Also entweder definiere vorher außerhalb der Functions Scriptvariablen in dieser Art
$script:rechneralt
$script:rechneralt = Read-Host ............
#Scriptvariablen vor Verwendung definieren
$script:rechneralt = ""
$script:rechnerneu = ""
function Rechnerabfrage {
$script:rechneralt = Read-Host "Name des bisheriger Rechners"
$script:rechnerneu = Read-Host "Name des neuen Rechners"
}
#Funktion aufrufen
Rechnerabfrage
#Variablen ausgeben
write-host $script:rechneralt
write-host $script:rechnerneu
oder du verwendest die Function dafür wofür sie eigentlich gedacht ist, zur Rückgabe von Werten. Dafür gibt es in Funktionen das Statement return $variable
Beispiel mit Rückgabe von Werten aus der Funktion als Hashtable
function Rechnerabfrage {
# Hashtable für mehrere Werte erzeugen
$ht = @{}
$ht.rechneralt = Read-Host "Name des bisheriger Rechners"
$ht.rechnerneu = Read-Host "Name des neuen Rechners"
# Hashtable aus der Funktion zurückgeben
return $ht
}
# Funktion ausführen und Werte übergeben
$result = Rechnerabfrage
#Ausgabe der Variablen
write-host $result.rechneralt
write-host $result.rechnerneu
p.s. Bitte nutze Code-Tags für deinen Quellcode:
<code> Quellcode </code>
. Merci.
Also von deinem Function gebummsel, krieg ich Gänsehaut
Ich würde es in dieser Art zusammenfassen, Fehlerabfragen der jeweiligen Befehle fehlen hier aber natürlich noch, dafür habe ich jetzt gerade keine Zeit.
Ich würde es in dieser Art zusammenfassen, Fehlerabfragen der jeweiligen Befehle fehlen hier aber natürlich noch, dafür habe ich jetzt gerade keine Zeit.
##Clear Screen from old Output
cls
$wPowerShell=new-object -comobject wscript.shell
$script:rechneralt = ""
$script:rechnerneu = ""
#************************************************************Ausführung als Administrator**************************************************************
$id=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal=New-Object System.Security.Principal.WindowsPrincipal($id)
if(!$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
$powershell=[System.Diagnostics.Process]::GetCurrentProcess()
$psi=New-Object System.Diagnostics.ProcessStartInfo $powershell.Path
$script=$MyInvocation.MyCommand.Path
$prm=$script
foreach($a in $args) {
$prm+=' '+$a
}
$psi.Arguments=$prm
$psi.Verb="runas"
[System.Diagnostics.Process]::Start($psi) | Out-Null
return;
}
#************************************************************Definierte Funktionen Teil 1***************************************************************
function CopyProfile ([bool]$newPC = $true) {
if ($newPC){
$rechneralt = Read-Host "Name des bisheriger Rechners"
$rechnerneu = Read-Host "Name des neuen Rechners"
$script:rechneralt = $rechneralt
$script:rechnerneu = $rechnerneu
}else{
$rechneralt = $script:rechneralt
$rechnerneu = $script:rechnerneu
}
$Username = Read-Host "Zu kopierendes Benutzerkonto"
#*******************************************************Generierte Pfade aus Abfrage "Rechner alt"*****************************************************
$PfadDesktopalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Desktop\"
$Pfadfavoritesalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Favorites\"
$Pfadlinksalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\Links\"
$Documentbuildingalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Document Building Blocks\"
$Proofalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Proof\"
$Signaturesalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Signatures\"
$Templatesalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Templates\"
$UProofalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\UProof\"
$Officealt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Office\"
$Systemcertificatesalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\SystemCertificates\"
$Outlookalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Outlook\"
$OfficeUIalt = "\\"+$rechneralt+"\C$\Users\"+$Username+"\AppData\Local\Microsoft\Office\"
#*******************************************************Kopiere in folgende Pfade zu "Rechner neu"*****************************************************
$PfadDesktopneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\Desktop\"
$Pfadfavoritesneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\Favorites\"
$Pfadlinksneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\Links\"
$Documentbuildingneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Document Building Blocks\"
$Proofneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Proof\"
$Signaturesneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Signatures\"
$Templatesneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Templates\"
$UProofneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\UProof\"
$Officeneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Office\"
$Systemcertificatesneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\SystemCertificates\"
$Outlookneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Roaming\Microsoft\Outlook\"
$OfficeUIneu = "\\"+$rechnerneu+"\C$\Users\"+$Username+"\AppData\Local\Microsoft\Office\"
# copy --------
Copy-Item $PfadDesktopalt $Pfaddesktopneu -Recurse
Copy-Item $Pfadfavoritesalt $Pfadfavoritesneu -Recurse
Copy-Item $Pfadlinksalt $Pfadlinksneu -Recurse
Copy-Item $Documentbuildingalt $Documentbuildingneu -Recurse
Copy-Item $Proofalt $Proofneu -Recurse
Copy-Item $Signaturesalt $Signaturesneu -Recurse
Copy-Item $Templatesalt $Templatesneu -Recurse
Copy-Item $UProofalt $UProofneu -Recurse
Copy-Item $Officealt $Officeneu -Recurse
Copy-Item $Systemcertificatesalt $Systemcertificatesneu -Recurse
Copy-Item $Outlookalt $Outlookneu -Recurse
Copy-Item $OfficeUIalt $OfficeUIneu -Recurse
}
CopyProfile
While ($true){
$Wartezeit = 0 # Benutzer muss selbst die Schaltfläche betätigen
$Schaltfläche = 4 # Schaltfläche Ja und Nein
$Antwort=$wPowershell.popup("Kopiervorgang abgeschlossen. Soll ein weiteres Benutzerkonto kopiert werden?",$Wartezeit,"Weiterer Kopiervorgang",$Schaltfläche)
if ($Antwort-eq 6) { # Fall "Ja" oder "Yes" gedrückt wurde...
CopyProfile -newPC $false
}else{
exit
}
}