Skript suche Ordner in Unterordner
Hallo Community,
ich versuche aktuell ein Skript zu schreiben dem ich einen Pfad übergeben kann und dies dann einen gestimmten String in den Ordner- Namen der Unterordner sucht, wurde der String gefunden soll in diesen Ordner ein Inhalt kopiert werden, danach soll weiter gesucht werden.
Ich hab aber leider überhaupt keinen Ansatz dazu, ich habe bis dato immer nur mit festen Pfaden gearbeitet und weiß nicht wie ich die Pfade einlesen könnte.
Was ich bis jetzt im Internet gefunden habe, war mir nicht so ganz klar.
Hat jemand von Euch eine Idee für mich wie ich das Problem umsetzten könnte?
Viele Dank und Grüße
EA
ich versuche aktuell ein Skript zu schreiben dem ich einen Pfad übergeben kann und dies dann einen gestimmten String in den Ordner- Namen der Unterordner sucht, wurde der String gefunden soll in diesen Ordner ein Inhalt kopiert werden, danach soll weiter gesucht werden.
Ich hab aber leider überhaupt keinen Ansatz dazu, ich habe bis dato immer nur mit festen Pfaden gearbeitet und weiß nicht wie ich die Pfade einlesen könnte.
Was ich bis jetzt im Internet gefunden habe, war mir nicht so ganz klar.
Hat jemand von Euch eine Idee für mich wie ich das Problem umsetzten könnte?
Viele Dank und Grüße
EA
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 223258
Url: https://administrator.de/forum/skript-suche-ordner-in-unterordner-223258.html
Ausgedruckt am: 22.12.2024 um 21:12 Uhr
6 Kommentare
Neuester Kommentar
Hallo EA,
Das Powershellscript wird dann folgendermaßen aufgerufen:
Es durchläuft alle Unterordner des Ordners und sucht nach dem Begriff der in der Variablen $suchbegriff steht. Wird dieser gefunden, wird der Inhalt den du in der Variablen $contentToCopy angibst in diesen Ordner kopiert.
Hinweis: Sollten Pfade in dem Suchordner mit dabei sein, welche die max. Zeichenzahl von 248 überschreiten wird das Script einen Fehler auswerfen. Leider hat hier blöder weise die Powershell bzw. das .NET-Framework eine Beschränkung eingebaut
p.s. wenn du noch nie mit Powershell gearbeitet hast, musst du einmalig den folgenden Befehl in einer PS-Console ausführen um PS-Scripte ausführen zu dürfen:
Der Aufruf erfolgt hier folgendermaßen:
Du kannst dich hier entscheiden ob du nur eine einzelne Datei oder einen ganzen Ordner in den jeweiligen Zielordner kopieren willst Zeilen 12 oder 14. Dazugehörig die Zeilen 23/25 mit den jeweiligen Kopierbefehlen. Suchstring steht in Zeile 10.
Grüße Uwe
Powershell-Variante:
param(
[Parameter(Mandatory=$true)]$folderSearch
)
$contentToCopy = "C:\Temp\DateiDieKopiertwerdensoll.csv"
$suchbegriff = "DeinSuchbegriff"
dir $folderSearch -Recurse | ?{$_.PSIsContainer -and $_.Name -like "*$suchbegriff*"} | %{copy-item $contentToCopy -Destination $_.FullName}
deinscript.ps1 -folderSearch "C:\Suchordner"
Hinweis: Sollten Pfade in dem Suchordner mit dabei sein, welche die max. Zeichenzahl von 248 überschreiten wird das Script einen Fehler auswerfen. Leider hat hier blöder weise die Powershell bzw. das .NET-Framework eine Beschränkung eingebaut
p.s. wenn du noch nie mit Powershell gearbeitet hast, musst du einmalig den folgenden Befehl in einer PS-Console ausführen um PS-Scripte ausführen zu dürfen:
Set-ExecutionPolicy -RemoteSigned
Alternativ eine Variante mit VB-Script:
Set args = WScript.Arguments
If args.length > 0 Then
startFolder = args.Item(0)
Else
WScript.Echo "Es fehlt der Parameter für den Suchordner"
WScript.Quit
End If
'Der String den du suchst
strSearch = "source"
'Einzelnes File hineinkopieren
fileToCopy = "C:\Temp\test.csv"
'Alternativ einen ganzen Ordner hinein kopieren
folderToCopy = "C:\TestQuellOrdnermitDateien"
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set rootFolder = fso.GetFolder(startFolder)
parseFolders rootFolder,True
Function parseFolders(strFldr,boolRecursion)
For each folder in strFldr.Subfolders
If InStr(1,folder.Name,strSearch,vbTextCompare) > 0 Then
fso.CopyFile fileToCopy, folder.Path & "\"
' Alternativ Kopieren eines ganzen Ordners
'fso.CopyFolder folderToCopy, folder.Path & "\"
End If
Next
If boolRecursion Then
For Each subFolder in strFldr.SubFolders
parseFolders subFolder, True
Next
End If
End Function
cscript.exe //NOLOGO deinScript.vbs "C:\Suchpfad"
Grüße Uwe
Hallo Eifeladmin!
Und als Batch (wenn tatsächlich alle Ordner unterhalb des Ausgangsordners - also auch Unter-Unterordner etc) berücksichtigt werden sollen, ungetestet etwa so:
Das "
Aufzurufen ist der Batch, wie gewünscht, mit Übergabe des Startordners als Parameter.
Sollte doch nur eine Unterordner-Ebene gemeint sein, die Zeile 5 durch
ersetzen.
Grüße
bastla
Und als Batch (wenn tatsächlich alle Ordner unterhalb des Ausgangsordners - also auch Unter-Unterordner etc) berücksichtigt werden sollen, ungetestet etwa so:
@echo off & setlocal
set "String=Dein Suchstring"
set "Inhalt=D:\Ein Inhalt.txt"
for /d /r %1 %%i in (*%String%*) do echo copy "%Inhalt%" "%%i"
pause
echo
" vor dem "copy
" simuliert (zum Testen) den Kopiervorgang nur, indem es den Kopierbefehl anzeigt - wenn Du es weglässt, wird tatsächlich kopiert. Die Ausgabe "1 Datei(en) kopiert." kannst Du übrigens mit einem ">nul
" am Ende der Zeile verschwinden lassen.Aufzurufen ist der Batch, wie gewünscht, mit Übergabe des Startordners als Parameter.
Sollte doch nur eine Unterordner-Ebene gemeint sein, die Zeile 5 durch
for /d %%i in ("%~1\*%String%*") do echo copy "%Inhalt%" "%%i"
Grüße
bastla
Hallo,
nachdem ich erst einen neuen Beitrag eröffnet habe und auf diesen verlinkt wurde, muss ich hier doch noch einmal nachfragen. Ich habe ein Problem beim Durchsuchen von Windows 7 Benutzerprofilen.
Folgende Schleife habe ich bisher in Verwendung:
FOR /F "Tokens=*" %%A in ('dir /B "%APPDATA%\Mozilla\Firefox\Profiles\*.default"') DO set FFPROFILE=%%A
Mein Problem ist nun das ich mit dem Skript nur den aktuellen Benutzer berühre. Da wir jedoch auf den Systemen multiuserfähig sein wollen, möchte ich ebenfalls alle Benutzerprofile erreichen. Ich habe mir nun eine vorgeschaltete Schleife vorgestellt, die mir alle Benutzerprofile mit den Ordnern \Mozilla\Firefox ausgibt und diesen String in den oben vorhandenen String übergeben. Habt ihr einen Tipp für mich?
nachdem ich erst einen neuen Beitrag eröffnet habe und auf diesen verlinkt wurde, muss ich hier doch noch einmal nachfragen. Ich habe ein Problem beim Durchsuchen von Windows 7 Benutzerprofilen.
Folgende Schleife habe ich bisher in Verwendung:
FOR /F "Tokens=*" %%A in ('dir /B "%APPDATA%\Mozilla\Firefox\Profiles\*.default"') DO set FFPROFILE=%%A
Mein Problem ist nun das ich mit dem Skript nur den aktuellen Benutzer berühre. Da wir jedoch auf den Systemen multiuserfähig sein wollen, möchte ich ebenfalls alle Benutzerprofile erreichen. Ich habe mir nun eine vorgeschaltete Schleife vorgestellt, die mir alle Benutzerprofile mit den Ordnern \Mozilla\Firefox ausgibt und diesen String in den oben vorhandenen String übergeben. Habt ihr einen Tipp für mich?
Hallo derhoeppi!
Du kannst dafür (und auch für die "*.default"-Ordner) wie oben gezeigt eine "
Allerdings wirst Du entweder "
Grüße
bastla
[Edit] Überzähligen Apostroph (vor der schließenden Klammer) entfernt. [/Edit]
Du kannst dafür (und auch für die "*.default"-Ordner) wie oben gezeigt eine "
for /d
"-Schleife verwenden:for /d %%u in ("C:\Users\*") do (
FOR /D %%A in ("%%u\APPDATA\Roaming\Mozilla\Firefox\Profiles\*.default") DO set "FFPROFILE=%%A"
)
delayedExpansion
" oder ein Unterprogramm oder eine direkte Verarbeitung des gefundenen Pfades über die Varaible %%A benötigen ...Grüße
bastla
[Edit] Überzähligen Apostroph (vor der schließenden Klammer) entfernt. [/Edit]