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-Key: 595941

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

Printed on: April 27, 2024 at 00:04 o'clock

Member: Lupora
Lupora Aug 13, 2020 at 18:40:18 (UTC)
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.
Member: SeaStorm
SeaStorm Aug 13, 2020 at 18:59:38 (UTC)
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
Member: Lupora
Lupora Aug 13, 2020 at 19:12:23 (UTC)
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.
Member: SeaStorm
SeaStorm Aug 13, 2020 at 19:44:45 (UTC)
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

}
Member: mbehrens
mbehrens Aug 13, 2020 at 20:28:00 (UTC)
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)
Member: Lupora
Lupora Aug 14, 2020 updated at 07:50:37 (UTC)
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.
Member: SeaStorm
Solution SeaStorm Aug 14, 2020 at 09:02:17 (UTC)
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
Member: Lupora
Lupora Aug 21, 2020 at 06:10:23 (UTC)
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? :/
Member: Lupora
Lupora Aug 21, 2020 at 06:15:56 (UTC)
Goto Top
Execution Policy etc. ist alles korrekt gesetzt.
Member: SeaStorm
SeaStorm Aug 21, 2020 at 06:32:49 (UTC)
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
Member: Lupora
Lupora Aug 21, 2020 at 08:10:23 (UTC)
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
**********************
Member: SeaStorm
SeaStorm Aug 21, 2020 at 09:54:58 (UTC)
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
Member: Lupora
Lupora Aug 21, 2020 at 10:34:06 (UTC)
Goto Top
clipboard01

Major Minor Build Revision
----- ----- --------
5 1 17763 1
Member: Lupora
Lupora Aug 21, 2020 at 10:37:47 (UTC)
Goto Top
Sieht nach 5.1 aus ?
Member: Lupora
Lupora Aug 21, 2020 at 10:46:49 (UTC)
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?
Member: SeaStorm
SeaStorm Aug 21, 2020 at 10:48:27 (UTC)
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
Member: Lupora
Lupora Aug 21, 2020 at 11:36:48 (UTC)
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?
Mitglied: 145033
145033 Aug 21, 2020 updated at 11:47:38 (UTC)
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.