lupora
Goto Top

Powershell - Alle Ordner eines Tages zählen und ausgeben

Hallo Experten,

ich möchte mir ein Script bauen was überprüft wie viele Ordner in einem gewissen Verzeichnis am Vortag erstellt wurden.
Das Ergebnis soll in eine Variable geschrieben werden.

Ablauf:
Das Script wird automatisiert ausgeführt um z.B. 17.00 Uhr. (Windows Task Scheduler).
Es prüft alle Ordner die im Zielverzeichnis am Vortag erstellt wurden. Wenn das z.B. 30 Ordner sind, wird in die Variable 30 geschrieben.
Das Creation Date kann als Größe heran gezogen werden.

Eine Besonderheit: Wenn das Script an einem Montag ausgeführt wird, soll es die Summe aller Ordner die in der vorherigen Woche erstellt wurden in eine Variable schreiben.
Die Variable gebe ich dann aus und schreibe sie weg.

Mein bisheriger Versuch:
[String] $folder="C:\Zielpfad";  
Get-ChildItem -Path $folder | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize;

Freue mich über Hilfe face-smile

Content-ID: 595941

Url: https://administrator.de/contentid/595941

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

Lupora
Lupora 13.08.2020 um 20:40:18 Uhr
Goto Top
Hab rausgefunden das ich mit
(get-date).AddDays(-1)
den Vortrag habe.

Jetzt bräuchte ich noch irgendwie ne Möglichkeit zu prüfen "überall wo Creationdate = Vortagsdatum zähle 1 hoch".

Evtl. noch ein Problem: In dem Zielverzeichnis gibt es circa 4000 bis 7000 Unterordner die zu prüfen wären.
SeaStorm
SeaStorm 13.08.2020 um 20:59:38 Uhr
Goto Top
Hi

[String] $folder="C:\temp";  
$date = (Get-Date).AddDays(-1).Date

$folders = Get-ChildItem -Path $folder -Directory | where {$_.CreationTime.Date -eq $date }
$folders | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize;
Write-Host Count: $folders.Count
Lupora
Lupora 13.08.2020 um 21:12:23 Uhr
Goto Top
Wow, genau was ich gesucht habe. Danke!

Letzte Frage: Könntest du mir mit dem zweiten Teil meines Scripts helfen?

Eine Besonderheit: Wenn das Script an einem Montag ausgeführt wird, soll es die Summe aller Ordner die in der vorherigen Woche erstellt wurden in eine Variable schreiben.
Die Variable gebe ich dann aus und schreibe sie weg.
SeaStorm
SeaStorm 13.08.2020 um 21:44:45 Uhr
Goto Top
Hi

ist eigentlich das gleiche in Grün.
Ich habs mal mit -Recurse gemacht, damit auch die Unterordner entsprechend gezählt werden
[String] $folder="C:\temp"  

if ((Get-Date).DayOfWeek.value__ -gt 1){
$date = (Get-Date).AddDays(0).Date
$folders = Get-ChildItem -Recurse -Path $folder -Directory | where {$_.CreationTime.Date -eq $date } 
$folders | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize
Write-Host Count: $folders.Count
}
else {
$beginlastweek = (Get-Date).AddDays(-7).Date
$endlastweek = (Get-Date).Date #Anpassen, falls Ende der Woche Freitag sein soll und nicht Sonntag
$LastWeekCount = (Get-ChildItem -Recurse -Path $folder -Directory | where {$_.CreationTime -gt $beginlastweek -and $_.CreationTime -lt $endlastweek }).Count

}
mbehrens
mbehrens 13.08.2020 um 22:28:00 Uhr
Goto Top
Zitat von @Lupora:

Hab rausgefunden das ich mit
(get-date).AddDays(-1)
den Vortrag habe.

Jetzt bräuchte ich noch irgendwie ne Möglichkeit zu prüfen "überall wo Creationdate = Vortagsdatum zähle 1 hoch".

Evtl. noch ein Problem: In dem Zielverzeichnis gibt es circa 4000 bis 7000 Unterordner die zu prüfen wären.

An schlechten Tagen als Einzeiler:

$Anzahl = ((Get-Date).DayOfWeek.value__ -eq 1) ? ((Get-ChildItem -Path $folder -Directory -Recurse | where {($_.CreationTine.Date -ge (Get-Date).AddDays(-7).Date) -and ($_.CreationTime.Date -lt (Get-Date).Date)} | Measure-Object).Count) : ((Get-ChildItem -Path $folder -Directory | where {$_.CreationTime.Date -eq (Get-Date).AddDays(-1).Date} | Measure-Object).Count)
Lupora
Lupora 14.08.2020 aktualisiert um 09:50:37 Uhr
Goto Top
Herzlichen Dank euch beiden!

Nach einigem hin und her jetzt noch die letzte Änderung:

Das Script soll grundsätzlich alle erstellten Ordner des Vortags ausgeben, alle erstellten Ordner des Vormonats, alle Ordner der Vorwoche und gesamt alle Ordner.
Die Thematik mit "nur Montags soll" ist erstmal egal.

Folgendes habe ich probiert:

Vortrag wird ausgegeben in:
$date = (Get-Date).AddDays(-1).Date
$folders = Get-ChildItem -Recurse -Path $folder -Directory | where {$_.CreationTime.Date -eq $date } 
$folders | SELECT Attributes, Name, CreationTime | Format-Table -AutoSize
Write-Host Count: $folders.Count

Alle Ordner werden ausgegeben:
(get-childitem -Path c:\temp -recurse | where-object { $_.PSIsContainer }).Count

Aber wie bekomme ich alle Ordner des Vormonats und Vorwoche hin? Das bisherige Script geht davon aus das es vom aktuellen Tag einfach 7 abzieht. Aber ich hätte gerne das er unabhängig einfach prüft welche Ordner wurden letzte Woche erstellt. Egal ob Montag oder Mittwoch ist.
SeaStorm
Lösung SeaStorm 14.08.2020 um 11:02:17 Uhr
Goto Top
Zitat von @Lupora:

Die Thematik mit "nur Montags soll" ist erstmal egal.
das ist ja schon fertig...

Aber wie bekomme ich alle Ordner des Vormonats und Vorwoche hin? Das bisherige Script geht davon aus das es vom aktuellen Tag einfach 7 abzieht.
Ja, weil der Part ja nur an einem Montag läuft
Aber ich hätte gerne das er unabhängig einfach prüft welche Ordner wurden letzte Woche erstellt. Egal ob Montag oder Mittwoch ist.
$MondayLastWeek = ((get-date).Date).AddDays(-((get-date).Date).DayOfWeek.value__ -6)
$SundayLastWeek = ((get-date).Date).AddDays(-((get-date).Date).DayOfWeek.value__ +1).AddMilliseconds(-1)

$FirstDayLastMonth = Get-Date ((get-date).Date).AddMonths(-1) -Day 1
$LastDayLastMonth = (Get-Date ((get-date).Date) -Day 1).AddMilliseconds(-1)

Damit solltest du den Rest anpassen können
Lupora
Lupora 21.08.2020 um 08:10:23 Uhr
Goto Top
Herzlichen Dank dir SeaStorm! Funktioniert Bombe face-smile Du bist alt ein Profi face-smile

Letzte Frage mit der ich noch kämpfe: Ich starte das Script über den Windows Task Scheduler einmal am Tag.
Leider ist der Output bei allen Variablen immer 0. Wenn ich allerdings das Script händisch starte (Rechtsklick "Run with Powershell") sind alle Outputs korrekt.

Das Script wird also vom Task Scheduler gestartet, aber alle Werte bleiben 0. Ich führe das Script ganz normal wie meinen anderen aus (Ausführendes Programm ist Powershell im Windows Verzeichnis, als Argument gebe ich den Powershell Pfad an).

Was mach ich falsch? :/
Lupora
Lupora 21.08.2020 um 08:15:56 Uhr
Goto Top
Execution Policy etc. ist alles korrekt gesetzt.
SeaStorm
SeaStorm 21.08.2020 um 08:32:49 Uhr
Goto Top
Mach mal um das Script ein Transcript.
Also
Start-Transcript -Path "c:\temp\blubb.log" -Append   

DEINCODE

Stop-Transcript

Dann wird alles nach c:\temp\blubb.log gelogged. Evtl. siehst du da was er nicht mag
Lupora
Lupora 21.08.2020 um 10:10:23 Uhr
Goto Top
Er verschluckt sich am Directory ??? Was mich wundert: Wenn ich das Script händisch startet, geht es perfekt.
Nur wenn ich es schedule tut es nicht.

Transcript started, output file is C:\Users\admin\Desktop\Powershell\error.log
PS>TerminatingError(Get-ChildItem): "A parameter cannot be found that matches parameter name 'Directory'."  
Get-ChildItem : A parameter cannot be found that matches parameter name 'Directory'.  
At C:\Users\admin\Desktop\Powershell\script.ps1:53 char:49
+ $folders = Get-ChildItem -Recurse -Path $folder -Directory | where {$ ...
+                                                 ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : A parameter cannot be found that matches parameter name 'Directory'.  
At C:\Users\admin\Desktop\Powershell\script.ps1:53 char:49
+ $folders = Get-ChildItem -Recurse -Path $folder -Directory | where {$ ...
+                                                 ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCo
   mmand

Alle Objekte gestern 0
PS>TerminatingError(Get-ChildItem): "A parameter cannot be found that matches parameter name 'Directory'."  
Get-ChildItem : A parameter cannot be found that matches parameter name 'Directory'.  
At C:\Users\admin\Desktop\Powershell\script.ps1:64 char:56
+ ... tWeekCount = (Get-ChildItem -Recurse -Path $folder -Directory | where ...
+                                                        ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : A parameter cannot be found that matches parameter name 'Directory'.  
At C:\Users\admin\Desktop\Powershell\script.ps1:64 char:56
+ ... tWeekCount = (Get-ChildItem -Recurse -Path $folder -Directory | where ...
+                                                        ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCo
   mmand

Alle Objekte letzte Woche:
PS>TerminatingError(Get-ChildItem): "A parameter cannot be found that matches parameter name 'Directory'."  
Get-ChildItem : A parameter cannot be found that matches parameter name 'Directory'.  
At C:\Users\admin\Desktop\Powershell\script.ps1:68 char:57
+ ... MonthCount = (Get-ChildItem -Recurse -Path $folder -Directory | where ...
+                                                        ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : A parameter cannot be found that matches parameter name 'Directory'.  
At C:\Users\admin\Desktop\Powershell\script.ps1:68 char:57
+ ... MonthCount = (Get-ChildItem -Recurse -Path $folder -Directory | where ...
+                                                        ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCo
   mmand

Alle Objekte letzten Monat:
get-childitem : Cannot find drive. A drive with the name 'E' does not exist.  
At C:\Users\admin\Desktop\Powershell\script.ps1:72 char:16
+ $allFolders = (get-childitem -Path $folder -recurse | where-object {  ...
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (E:String) [Get-ChildItem], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
get-childitem : Cannot find drive. A drive with the name 'E' does not exist.  
At C:\Users\admin\Desktop\Powershell\script.ps1:72 char:16
+ $allFolders = (get-childitem -Path $folder -recurse | where-object {  ...
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (E:String) [Get-ChildItem], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Alle Ordner:  0
1
**********************
Windows PowerShell transcript end
End time: 20200821094603
**********************
SeaStorm
SeaStorm 21.08.2020 um 11:54:58 Uhr
Goto Top
A parameter cannot be found that matches parameter name 'Directory'
Kann es sein das du beim Start der Task die powershell.exe mit dem kompletten Pfad angibst und da eine alte Powershellversion nimmst?
Wenn der Befehl den Parameter nicht kennt, kann das eigentlich nur bedeuten das du da eine alte PS Version hast.

Gib mal im Script
$PSVersionTable.PSVersion
mit aus
Lupora
Lupora 21.08.2020 um 12:34:06 Uhr
Goto Top
clipboard01

Major Minor Build Revision
----- ----- --------
5 1 17763 1
Lupora
Lupora 21.08.2020 um 12:37:47 Uhr
Goto Top
Sieht nach 5.1 aus ?
Lupora
Lupora 21.08.2020 um 12:46:49 Uhr
Goto Top
Habe mich Google bedient und folgendes rausgefunden:

-Directory is a conditional parameter and only works on paths whose provider is "FileSystem". It's present on this page: Get-ChildItem for FileSystem, but not on the generic one.

Das Verzeichnis E:\ was hier durchsucht werden soll ist ein Netzwerklauf. Kann es sein das ein netzwerklauf nicht als FileSystem anerkannt wird, weil es ja keine physische Platte ist?
SeaStorm
SeaStorm 21.08.2020 um 12:48:27 Uhr
Goto Top
ahhh.
Ne, du führst das Script ja ohne Benutzeranmeldung aus. Dann existiert E: nicht in der Laufzeitumgebung des Scripts. Gib hier einfach den vollen UNC Pfad an
Lupora
Lupora 21.08.2020 um 13:36:48 Uhr
Goto Top
Das war der Fehler! Da wäre ich nie drauf gekommen! Das E-Laufwerk wird es zur Laufzeigumgebung gemappt.
Mit UNC Pfad hat es funktioniert.

Wirklich allerletzte Frage:

Ich möchte in einer Variable alle Ordner ausgeben (all Folders) die jemals erstellt wurden einschließlich gestern. Nur die von heute nicht.
Bisher ist meine Formel:
$allFolders = (get-childitem -Recurse -Path $folder -Directory | where-object { $_.PSIsContainer }).Count

Die beinhaltet aber auch die Ordner von heute. Ich möchte alle Ordner zählen außer die von heute.
Wie müsste ich das anpassen?
145033
145033 21.08.2020 aktualisiert um 13:47:38 Uhr
Goto Top
Zitat von @Lupora:
Ich möchte in einer Variable alle Ordner ausgeben (all Folders) die jemals erstellt wurden einschließlich gestern. Nur die von heute nicht.
Bisher ist meine Formel:
$allFolders = (get-childitem -Recurse -Path $folder -Directory | where-object { $_.PSIsContainer }).Count

Die beinhaltet aber auch die Ordner von heute. Ich möchte alle Ordner zählen außer die von heute.
Wie müsste ich das anpassen?

Bidde
$allFolderCountWithoutToday = (get-childitem -Recurse -Path $folder -Directory | ?{$_.CreationTime -lt (get-date).Date}).Count
$allFolderCountWithoutToday

Btw. das "PSIsContainer" ist doppelt gemoppelt und überflüssig, das Ausfiltern macht schon der Parameter -Directory von Get-ChildItem.