Benutzer mit den meisten Antworten
Verzeichnisse auslesen ( Ordner und Dateien + Erstellungs- und Änderungsdatum)

Frage
-
Hallo,
Ich bin der Maikel, ich habe bisher kaum mit PS gearbeitet und bin auch nicht der Programmierer.
Ich muss dennoch ein PS Skript erstellen, dass Verzeichnisse ausliest. Es soll anschließend eine E-Mail senden, dort drin soll halt stehen welche Ordner und Dateien sich im Verzeichnis befinden mit Erstellungs- und Änderungsdatum.
Ich würde euch bitten mir zu helfen. Bitte detailliert alles aufschreiben (Code und Schritte die zu machen sind), da ich wie schon geschrieben ein großer Anfänger bin!.
Danke :)
- Typ geändert Raul TalmaciuMicrosoft contingent staff Donnerstag, 28. Juni 2012 14:07 Warten auf Feedback
- Typ geändert Denniver ReiningMVP, Moderator Dienstag, 3. Juli 2012 12:07
Antworten
-
Hallo Maikel,
da schließe ich mich Peter an; Sinn des Forums ist es, Hilfestellung zu geben, nicht Deine Arbeit zu machen.
Zudem lohnt es sich, sich mit PowerShell zu beschäftigen, den die Power steckt hier nicht nur im Namen. Das Auflisten der Order+Dateien aus einem Verzeichnis ist eigentlich nur ein einfacher 1-Zeiler an Script Code:
[String] $folder="C:\temp"; Get-ChildItem -Path $folder | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize;
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Bearbeitet Olaf HelperMVP Freitag, 22. Juni 2012 11:06
- Als Antwort markiert pakito1992 Mittwoch, 4. Juli 2012 12:14
-
Wenn du auch alle Unterordner auslesen möchtest dann nimmst du den Parameter -recurse
[String] $folder="C:\temp"; Get-ChildItem -Path $folder -recurse | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize;
Deshalb die Frage was du genau möchtest ;-)
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Freitag, 22. Juni 2012 11:16
- Als Antwort markiert pakito1992 Mittwoch, 4. Juli 2012 12:14
-
Mit der LastWriteTime Eigenschaft des File Objektes:
[String] $folder="C:\temp"; Get-ChildItem -Path $folder | SELECT Attributes, Name, CreationTime, LastWriteTime | Format-Table -AutoSize;
Siehe auch TechNet Get-ChildItem für mehr Infos zu dem CmdLet.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert pakito1992 Freitag, 22. Juni 2012 11:53
- Tag als Antwort aufgehoben pakito1992 Freitag, 22. Juni 2012 11:53
- Als Antwort markiert pakito1992 Mittwoch, 4. Juli 2012 12:14
Alle Antworten
-
Hallo Maikel ! Willkommen!
Wir machen gerne für dich, deine PowerShell Übungsaufgaben ;-)
Bitte beschreib mal genauer wie die Verzeichnisse ausgelesen werden sollen bzw welches Ergebnis bei diesem Schritt erwartet wird.
Das mit der E-Mail ist dann erst der zweite schritt.
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Freitag, 22. Juni 2012 10:44
-
-
Hallo Maikel,
da schließe ich mich Peter an; Sinn des Forums ist es, Hilfestellung zu geben, nicht Deine Arbeit zu machen.
Zudem lohnt es sich, sich mit PowerShell zu beschäftigen, den die Power steckt hier nicht nur im Namen. Das Auflisten der Order+Dateien aus einem Verzeichnis ist eigentlich nur ein einfacher 1-Zeiler an Script Code:
[String] $folder="C:\temp"; Get-ChildItem -Path $folder | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize;
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Bearbeitet Olaf HelperMVP Freitag, 22. Juni 2012 11:06
- Als Antwort markiert pakito1992 Mittwoch, 4. Juli 2012 12:14
-
Wenn du auch alle Unterordner auslesen möchtest dann nimmst du den Parameter -recurse
[String] $folder="C:\temp"; Get-ChildItem -Path $folder -recurse | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize;
Deshalb die Frage was du genau möchtest ;-)
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Freitag, 22. Juni 2012 11:16
- Als Antwort markiert pakito1992 Mittwoch, 4. Juli 2012 12:14
-
Mit der LastWriteTime Eigenschaft des File Objektes:
[String] $folder="C:\temp"; Get-ChildItem -Path $folder | SELECT Attributes, Name, CreationTime, LastWriteTime | Format-Table -AutoSize;
Siehe auch TechNet Get-ChildItem für mehr Infos zu dem CmdLet.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert pakito1992 Freitag, 22. Juni 2012 11:53
- Tag als Antwort aufgehoben pakito1992 Freitag, 22. Juni 2012 11:53
- Als Antwort markiert pakito1992 Mittwoch, 4. Juli 2012 12:14
-
Get-Help Send-MailMessage -Full | More
und
Get-Help Send-MailMessage -Examples | more
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Freitag, 22. Juni 2012 11:57
-
... unter Link zum Nachlesen, was man damit alles machen kann: TechNet Send-MailMessage
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Schau dir in der PowerShell Hilfe (auch Olaf´s Link ) die Beispiele an (Examples) und die musst du auf deine Umgebung anpassen (E-mail adressen, E-mail Server)
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Ja kla, das weiß ich ja. Aber erstmal muss ja der erste Befehl eingefügt werden.
Danach muss man doch auch einen Befehl einfügen dass die oberen Informationen per Email gesendet werden sollen oder nicht?
Wie kann man denn den zweiten mit dem ersten Befehl "kombinieren"?
-
Falsche Vorgehensweise!
Verschick doch erstmal eine E-Mail, mit einem einfachen Text darin !
Wenn das Klappt, dann können wir die beiden schritte "zusammenkleben".Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
function sendmail($body)
{
$filename = "C:\Users\xx\Desktop\Neues Textdokument.txt"
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$att = new-object Net.Mail.Attachment($filename)
$SmtpClient.Host = "195.145.226.131"
$mailmessage.from = "postmaster@xx.de"
$mailmessage.To.add("dd@xx.de")
$mailmessage.Subject = “Verzeichnisinhalt”
$MailMessage.IsBodyHtml = $true
$mailmessage.Body = $body
$mailmessage.Attachments.Add($att)
$smtpclient.Send($mailmessage)
}
$body = "hhhhh"
sendmail $bodyDas klappt leider nicht.
$SmtpClient.Host = der SMTP Server oder?
-
Warum so umständlich über einen SmtpClient und nicht über das Send-MailMessage CmdLet; das ist nur ein Aufruf mit ein paar Parametern?
Ja, mit Host ist der Name des zu verwendenen Smtp Mailserver gemeint; bei Send-MailMessage heisst der Parameter sogar gleich "SmtpServer".
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Genau !
Versuch das mal so:
Send-Mailmessage ` -from "E-Mail-Von-Adresse@Web.de" ` -to "E-Mail-AN-Adresse@Web.de" ` -subject "Text der Betreffzeile hier eingeben" ` -body "Hier wird der Emailtext eingegeben" ` -smtpServer smtp.fabrikam.com # <--- hier den Mailserver eintragen der die E-mail versenden soll
So ich muss jetzt weg !
Schönes Fussball Wochenende!
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Freitag, 22. Juni 2012 12:59
-
Was konkret verstehst Du nicht?
Send-MailMessage erledigt alles, was Du davor als längers Script hattest. Über die Parameter gibst Du die gewünschten Werte an, z.B. mit "-smtpServer smtp.fabrikam.com" den Smtp Server Alias Host.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Wenn der Parameter To kommt, geht es nicht weiter. Es kommt danach weitere "To"s, also To1, To2 usw
- Bearbeitet pakito1992 Freitag, 22. Juni 2012 13:35
-
-
Nein wenn ein weiteres To abgefragt wird MUSS ein leeres TO mit der Enter taste bestätigt werden. Damit PowerShell weiss das es keine weiteren empfänger mehr gibt.
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Freitag, 22. Juni 2012 15:13
-
Du siehst, es ist gar nicht so leicht jemanden dem alle Grundlagen fehlen über ein Forum etwas beizubringen.
Öffne mal die PowerShell ISE (Integrated Script Environment)
Dies kannst du auf verschiedenen Arten tun:
1. “Windows > Start > Alle Programme > Zubehör > Windows PowerShell > PowerShell ISE”
2. Im Eingabe Feld: “Windows > Start > Programme / Dateien durchsuchen“ gibst du folgenden Befehl ein: PowerShell_ISE
3. Öffne eine PowerShell und gib folgenden Befehl ein: PowerShell_ISE
Danach hast du die PowerShell ISE zu Verfügung zum bediener der ISE kannst du dir folgendes Youtube Video anschauen (englisch) : http://www.youtube.com/watch?v=I-M3Lx-1ay0Nun kopierst du meinen E-Mail Code mit dem Send-Mailmessage Cmdlet in den oberen Skriptbereich.
Der Skriptbereich ist nichts anders als ein Texteditor.
Dort kannst du bei den Parametern die Angaben ändern.
Bitte ändere nur die Angaben bei den Parametern -from, -to und –smtpServer alles andere lass so wie es ist.
Es kann sein das dein smtpServer die Angabe von deinem Mailkonto benötigt.
Dann musst du dem Mailserver noch dein Usernamen und dein Passwort angeben, dies macht man mit dem Parameter –credential.
Mit welchem Mail Provider möchtest du deine E-Mail versenden ? Web.de? GMX ? Telekom?Send-Mailmessage ` -from "E-Mail-Von-Adresse@Web.de" ` -to "E-Mail-AN-Adresse@Web.de" ` -subject "Text der Betreffzeile hier eingeben" ` -body "Hier wird der Emailtext eingegeben" ` -smtpServer smtp.fabrikam.com # <--- hier den Mailserver eintragen der die E-mail versenden soll
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Montag, 25. Juni 2012 06:30
-
Hallo,
haben die letzten Beiträge die Thematik geklärt?
Gruss,
RaulRaul Talmaciu, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo,
tut mir leid dass ich mich erst jetzt wieder melden konnte.
Ich habe es jetzt endlich geschafft, nach mehreren Tagen Arbeit.
Jetzt möchte ich aber noch folgendes einbauen,
Dieses Skript soll ja automatisch laufen, wenn es beim Auslesen des Verzeichnisse eine Veränderung bemerkt (Größe einer Datei/Ordners hat sich verändert, mehr oder weniger Dateien im Verzeichnis) soll es eine Email versenden, ansonsten nicht.
Hier mein bisheriger Code:
[String] $folder="C:\Users\XX\Desktop\PS Skript";
Get-ChildItem -Path $folder | SELECT Attributes, Name, CreationTime, LastWriteTime, Length | out-File "C:\Users\XX\Desktop\PS Skript\Log.txt"
# Größe in MB: @{Name="Size(MB)";Expression={$_.Length /1MB}}
# Change these values
$Logfile = "C:\Users\XX\Desktop\PS Skript\Log.txt"
$EmailFrom = "test@testde"
$EmailTo = "test2@test.de"
$EmailBody = "Geschafft"
$EmailSubject = "PS Test"
$SMTPServer = "xxx.xxx.xxx.xxx"
# Send E-mail message with log file attachment
$Message = New-Object Net.Mail.MailMessage($EmailFrom, $EmailTo, $EmailSubject, $EmailBody)
$Attachment = New-Object Net.Mail.Attachment($Logfile, 'text/plain')
$Message.Attachments.Add($Attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer)
$SMTPClient.Send($Message)
- Bearbeitet pakito1992 Montag, 2. Juli 2012 09:47
-
Ich empfehle dir da die .NET Klasse Filesystemwatcher zu nehmen:
http://www.powershellpraxis.de/FileMonitoring.1176.0.htmlPlease click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Versuch dich bitte ein wenig klarer auszudrücken!
Du meinst sicherlich das du die Ordner grösse, mitsammt aller Unterordner und den darin befindlichen Dateien haben möchtest!?
Da ist die Internet suche dein Freund!
Das geht mit dem Parameter -Recurse bei dem Cmdlet Get-Childitem!
Bei Verzeichnissen mit vielen Dateine dauert das sehr lange, da PowerShell alle Dateien "anfassen" muss.
# Grösse eines Verzeichnisses ermitteln. Inklusive aller Unterverzeichnisse (-Recurse) (Get-ChildItem -Path 'C:\Temp' -Recurse | Measure-Object -sum -property Length).sum
Dein Skript wir dann so aussehen:
$folder='C:\Users\XX\Desktop\PS Skript' $Logfile = 'C:\Users\XX\Desktop\PS Skript\Log.txt' # Dateiliste erstellen, mit allen unterverzeichnissen (-Recurse) $Dateiliste = Get-ChildItem -Path $folder -Recurse | SELECT Attributes, Name, CreationTime, LastWriteTime, Length # Geammtgrösse des Verzeichnisses berechnen $GesammtGroesse = ($Dateiliste | Measure-Object -sum -property Length).sum # Dateiliste in Datei schreiben Out-File -InputObject $Dateiliste -FilePath $Logfile # Grösse des gesammten Verzeichnissen an die Datei anhängen (-Append) Out-File -InputObject $('Gesammt grösse des Verzeichnisses: ' + ($GesammtGroesse / 1MB) + "MB") -FilePath $Logfile -Append # E-Mail senden Send-MailMessage -From "test@testde" -To "test2@test.de" -Body "Geschafft" -Subject "PS Test" -SmtpServer "xxx.xxx.xxx.xxx" -Attachments $Logfile
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Ein Ordner hat keine Grösse !
Nur die Dateien die in dem Ordner liegen haben eine grösse!
Deshalb musst du für jeden Ordner der in deinem Ordner liegt die Grösse ermitteln:# Grösse eines Verzeichnisses ermitteln. Inklusive aller Unterverzeichnisse (-Recurse) (Get-ChildItem -Path 'C:\Temp' -Recurse | Measure-Object -sum -property Length).sum
Etwa so !???:
$folder='C:\Users\XX\Desktop\PS Skript'
$Logfile = 'C:\Users\XX\Desktop\PS Skript\Log.txt'
Get-ChildItem $folder | Where-Object {$_.PSIsContainer -eq $True} | Select-Object -property Fullname,@{Name="Size"; Expression = { [int](Get-ChildItem -Path $_.FullName -Recurse | Measure-Object -sum -property Length -ErrorAction SilentlyContinue ).sum}} | Format-Table -AutoSize | Out-File -FilePath $Logfile -Append
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Montag, 2. Juli 2012 14:06
-
Maikel ist dein Problem gelöst? Wenn ja markiere bitte alle die Einträge, die Fragen von dir beantwortet haben als "Antwort" (der Button hierzu befindet sich unter jedem Eintrag).
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
- Bearbeitet Denniver ReiningMVP, Moderator Mittwoch, 4. Juli 2012 10:52