Jump to content

Codebeispiele + Erklärungen für foreach


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo danke für den Hinweiß mit {

 

das was ich jetzt noch habe ist ...

 

das Script läuft durch macht aber nix ?

 

#Quelle
$src = "C:\filetyp"
#Ziel
$dst = "\\fileserver01\filetyp"

#Schleife über Dateisystem.
foreach($file in (Get-ChildItem $src -Recurse -include *.txt,*.doc,*.ppt)){

#Dateiname im Ziel
$dstfile = $file.FullName.replace("$src","$dst")

#Ordner im Ziel
$dstfolder = $dstfile.split('\')[0..($dstfile.split('\').length-2)] -join '\'

#Testen ob diese Datei NICHT existiert
if(!(test-path $dstfile)){

	#Testen ob ein Ordner existiert
	if(!(test-path $dstfolder)){

		#Wenn er nicht existiert, dann an anlegen
		new-item $dstfolder -type directory -recurse

	}

	#Wenn die Datei nicht existiert von der Quelle kopieren
	copy-item $file.FullName $dstfolder

}
}

 

Weiters möchte ich eine Abfrage einbauen die das Script mit protokoliert, was genau passiert ? Wie kann ich das am besten lösen.

 

Und nochmals ich kann mich nur bei euch bedanken das ihr euch Zeit nehmst.

Echt ein klasse Forum. ( Kennt man eigentlich nicht so aus der Windows Welt)

 

Na dann im diesem Sinne wünsche ich euch allen einen wünderschönen Guten Morgen :)

Link zu diesem Kommentar

So das Script läuft jetzt wunderbar :)

 

hab mich verguckt ...

 

so daher es noch weiter geht lasse ich den Thread noch offen :)

 

ich soll nun in das Vorhande Script eine Abfrage einbauen die folgendes kann:

 

Also wenn auf den Quell Laufwerk eine Datei Gleich ist am Ziel Laufwerk soll er abbrechen.

Sofrot raus.

 

Und dann soll ich noch in der Varaiable eine String definieren wo die Daten hinkopiert worden sind, wenn er nicht abbricht.

 

Wie gesagt daher mir das ganze noch neu ist bitte ich um Anregungen sowie Hilfe

 

Danke

bearbeitet von schreckinger
Link zu diesem Kommentar

Ja des schon, aber wenn eine Datei gleich ( besser gesagt wenn der Dateiname schon vorhanden ist) ist soll er abbrechen.

aber dann komplett raus.

 

Dass soll ich in einem Log mitschreiben wenn er abbricht.

 

Wenn aber keine Datei gleich sind soll das Script einfach alle Dateien Kopieren und dann in eine Variable in einem String speichern.

Im String soll der Pfad der kopierenden Datei stehen.

 

Die File brauche ich nur auf den Namen checken, der Inhalt ist nicht wichtig.

 

Danke nochmals

Link zu diesem Kommentar
Ja des schon, aber wenn eine Datei gleich ( besser gesagt wenn der Dateiname schon vorhanden ist) ist soll er abbrechen.

aber dann komplett raus.

 

Dass soll ich in einem Log mitschreiben wenn er abbricht.

 

Wenn aber keine Datei gleich sind soll das Script einfach alle Dateien Kopieren und dann in eine Variable in einem String speichern.

Im String soll der Pfad der kopierenden Datei stehen.

 

Die File brauche ich nur auf den Namen checken, der Inhalt ist nicht wichtig.

 

Dann zeig doch mal deinen Ansatz für diese Aufgabe. Wo genau hakt es?

blub

Link zu diesem Kommentar

Hallo Blubb...

 

okay wo es hackt ;) leider zur Zeit noch an mehren Stellen.

 

#Quelle
$src = "C:\filetyp"
#Ziel
$dst = "\\fileserver01\filetyp"

#Schleife über Dateisystem.
$abc = foreach($file in (Get-ChildItem $src -Recurse -include *.txt,*.doc,*.ppt)){

#Dateiname im Ziel
$dstfile = $file.FullName.replace("$src","$dst")

#Ordner im Ziel
$dstfolder = $dstfile.split('\')[0..($dstfile.split('\').length-2)] -join '\'

#Testen ob diese Datei NICHT existiert
if(!(test-path $dstfile)){

	#Testen ob ein Ordner existiert
	if(!(test-path $dstfolder)){

		#Wenn er nicht existiert, dann an anlegen
		new-item $dstfolder -type directory -recurse

	}s

	#Wenn die Datei nicht existiert von der Quelle kopieren
	copy-item $file.FullName $dstfolder

}
}

Start-Transaction -path "C:\Benutzer\lrzlboh\Desktop\transcript1.txt" -noclobber

#$abc | Select-String -path

 

Habe den Ansatz das ich mit Transaction vorgänge in einer Log Datei sichere, und mit die ganze Foreach Schleife in einer Variablen definiere damit ich dann $abc mit "Select-String" den Pfad auslesen kann ...

bin mir aber noch nicht im Klaren wie das genau Funktioniert..

 

Habe mir gerade das Buch PowerShell in Action zu gelegt also sollte es bald aufhörn mit der Fragerei, aber wie gesagt bin ich sehr dankbar für Hilfe oder einen Denk Anstoß.

Link zu diesem Kommentar

für was willst du Transaktionen sichern ?

 

Wäre es nicht besser die wichtigen Ereignis einfach in das Log zu schreiben. Die Daten werden einfach angefügt (append)

z.B.

 

$event = "hier steht dein Fehler oder deine Info"

#Setzt das Datum (zum String formatiert) -kann man bei Bedarf auch in anderen Format ausgeben- und den String in das angegebene Log. 
(get-date).toString() + $event >> c:\log.log

 

Das was du beschreibst ist ja kein Log mehr :), eher ein Transaktionsprotokoll...

 

Bzgl. Zeitstempel kann ich eine Funktion empfehlen. Einfach oben im Skript einfügen und darunter ausführen. Der Zeitstempel ist ein valider SQLTimestamp (Powershell bietet die Formatierung leider nicht mit Boardmitteln an)

Ausgabe sieht so aus: 20120316 12:14:06

YYYYMMDD HH:MM:SS

 

Function timestamp
{
$now=get-Date
$yr=$now.Year.ToString()
$mo=$now.Month.ToString()
$dy=$now.Day.ToString()
$hr=$now.Hour.ToString()
$mi=$now.Minute.ToString()
$se=$now.Second.ToString()
if ($mo.length -lt 2) 
{
	$mo="0"+$mo #pad single digit months with leading zero
}
if ($dy.length -lt 2) 
{
	$dy="0"+$dy #pad single digit day with leading zero
}
if ($hr.length -lt 2) 
{
	$hr="0"+$hr #pad single digit hour with leading zero
}
if ($mi.length -lt 2) 	
{
	$mi="0"+$mi #pad single digit minute with leading zero
}
if ($se.length -lt 2)
{
	$se="0"+$se #pad single digit minute with leading zero
}
write-output $yr$mo$dy" "$hr":"$mi":"$se
}

 

Wichtig: Der Funktionsaufruf im Skript muss immer unterhalb der Funktion folgen, dann könnte das Ganze auch wie folgt aussehen:

 

$event = "hier steht dein Fehler oder deine Info"

#Setzt das Datum (zum String formatiert) und den String in das angegebene Log. 
(timestamp)+ $event >> c:\log.log

Link zu diesem Kommentar

hallo

 

danke erstmal für die Erklärung.

 

Aber mir ist unklar wofür ich einen Zeitstempel funktion benötigte ?

 

Überprüft diese Function die Zeitstempel von Datein damit diese nicht daruüber kopiert werden ?

 

Kann ich das nicht lösen mit dem Operator -match in der schleife ?

 

Das mit log werde ich verwenden. Die Transaktionen brauche ich nicht zu sichern dachte mir nur das wird alles mit Protokliert was passiert.

 

Frage zum

 

$event = "hier steht dein Fehler oder deine Info"

#Setzt das Datum (zum String formatiert) -kann man bei Bedarf auch in anderen Format ausgeben- und den String in das angegebene Log. 
(get-date).toString() + $event >> c:\log.log

 

Brauche ja den Pfad der Datei die Kopiert wird, deswegen bin ich leicht verunsichert wegen den Zeitangaben im Code ( Get-date) und wegen dem Zeitstempel.

 

Ich freue mich auf eine Antwort :)

Link zu diesem Kommentar

Ich weiß nicht was du kopieren willst, aber generell gehört zu einem Log ein Zeitstempel.

Mit deinem Dateivergleich hat das nichts zu tun, ein Log speichert Ereignisse und führt nix aus. Das war nur ein allgemeiner Hinweis wie man eine Logdatei erstellen kann.

 

edit: Du konntest aber z.B Übereinstimmungen loggen oder Aktionen, das ist von deiner Skriptlogik abhängig.

 

PS: Vielleicht solltest du erstmal ein DV Konzept erstellen, darin kann man dann auch definieren was erfordert ist udn wie was gelöst wird. Im Anschluss kann man dann den passenden Skript erstellen.

bearbeitet von PowerShellAdmin
Link zu diesem Kommentar

Also

 

Ich habe einen Lokalen Ordner am PC.

 

Dieser beinhaltet 3 File Typen.

 

Dann möchte ich die Daten vom Lokalen PC auf den Fileserver speichern.

 

Dort soll er abgleichen ob es die Dateien dort schon gibt. Sprich auf den Namen matchen.

 

Wenn er alles Kopiert ohne eine Doppelte Datei zu finden dann soll es normal beendet werden und die Daten die kopiert worden sind sollen in einen String stehen ( mit der Pfad angabe)

 

Wenn aber eine Datei doppelt ist, soll das Script abbrechen und die Message ins Error log schreiben.

 

Das soll ich machen.

Link zu diesem Kommentar

ok ist doch nicht schwer, du baust in deinem Skript eine Überprüfung - z.B. per IF ein, in der du deine Prüfung durchführst.

 

Das Ganze wird in einer Foreachschleife laufen, ich gehe davon aus dass das $object eine Datei ist und die Property Name den Dateinamen bzw Pfad enthält

#erstellt eine Variable (Typ String) und initialisiert diese mit der Fehlermeldung
[string]$error="Datei"+$object.name+"ist bereits vorhanden"
if (Bedingung)
{

#Setzt das Datum (zum String formatiert) -kann man bei Bedarf auch in anderen Format ausgeben- und den String in das angegebene Log. 
(get-date).toString() + $error>> c:\log.log
# Bricht den Skript ab
exit
} 

 

Das sollte dir eigentlich ausreichend helfen, ich bin der Meinung das Skripten kriegst du selbst hin. Die Herausforderung ist ja für ein Anfänger durchaus machbar und du solltest wissen wo du ansetzt.

Bin im Bereich PowerShell auch noch nicht fortgeschritten, die Einarbeitung macht viel Spaß und Google ist dein Freund :) Habs und machs noch genauso, hänge auch grade am Multithreading/Jobs und suche eine Lösung die beste Fehlerabarbeitung.

bearbeitet von PowerShellAdmin
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...