Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Powershell: Dateien suchen, Ordner, Unterordner

Frage Entwicklung Batch & Shell

Mitglied: internet2107

internet2107 (Level 1) - Jetzt verbinden

19.10.2014 um 09:55 Uhr, 6256 Aufrufe, 5 Kommentare, 3 Danke

Hallo und guten Morgen.

Leider habe ich noch einen Teil 2, den ich irgendwie nicht gelöste bekomme. Dank @colinardo (Uwe) wurde der Teil 1 sehr gut gelöst, dafür noch mal großen Dank.

Nun habe ich aber noch folgendes Problem.
Wie im Teil 1 bekannt, sollen aus Ordnern und Unterorder bestimmte Dateien gefiltert und entsprechend verarbeitet werden, was ja nun auch wieder klappt.
Nach der Verarbeitung sollen aber die verarbeiteten Dateien entsprechend an einem anderen Ort erstellt werden, inkl. dem Ordner/Unterordner wie an der Quelle.

Beispiel:
Vor der Verarbeitung soll in einem Quellordner, indem sich ca. 10.000 Dateien befinden, inkl. seiner Unterordner nach Dateien vom Typ x gesucht werden, diese werden dann verarbeitet (umgewandelt nach PDF). Das klappt ja auch einwandfrei.
Nur soll am Ziel auch genauso wieder die Ordnerstruktur erstellt werden, inkl. der Unterordner und dort die verarbeiteten Dateien abgelegt werden.

01.
$DATDateien = dir "C:\Temp\test_dat\" -include *.mxa, *.dra, *.log -recurse  
Dieser "test_dat" - Ordner hat ggf. xx Unterordner, indem auch wieder eine Menge Dateien liegen und ggf. verarbeitet werden müssen, sofern sie die Bedingung (Filter) erfüllen.
Dann werden alle gefilterten Dateien in Word geöffnet, dort verarbeitet und als PDF gespeichert. Auch das klappt einwandfrei.

SOLL soll aber sein, dass alle Dateien im Zielordner auch jeweils genauso wieder in Unterordnern erstellt werden

Vielen Dank vorab.
Mitglied: colinardo
19.10.2014, aktualisiert um 11:13 Uhr
Moin internet2107,
auch noch am Sonntag fleißig .

Auf deinen letzten Post bezogen könnt dies so aussehen:
(Kommentare siehe Code)
01.
$sourceRoot = 'c:\deinPfad' 
02.
$targetRoot = 'D:\deinzielPfad' 
03.
dir $path -Include '*.xlsb' -Recurse | %{ 
04.
    # passende DAT Datei suchen 
05.
    $dat = dir "$sourceRoot\$($_.BaseName.Replace('_','-'))*_USED.DAT" -Recurse | select -First 1 
06.
    # wenn eine zur xlsb-Datei passende DAT-Datei gefunden wurde 
07.
    if ($dat){ 
08.
        write-host "Für folgende Datei wurde eine USED-DAT gefunden:"$_.FullName 
09.
         
10.
        # ----------------------------------------------------- 
11.
        # Name des neuen Ordners erstellen indem der Quell-Root durch den Zielroot ersetzt wird 
12.
        $newDir = $_.DirectoryName.Replace($sourceRoot,$targetRoot) 
13.
        # Zielordnerstruktur erstellen 
14.
        new-item -ItemType Directory -Path $newDir -Force 
15.
        # File an seinen neuen Ort kopieren 
16.
        copy-item $_.FullName "$newDir\$($_.Name)" -Force 
17.
        # ----------------------------------------------------- 
18.
19.
}
Das Prinzip ist folgendes: Du ersetzt im Pfadnamen der Datei mit Replace dein Quell-Root mit deinem Zielroot, danach erstellst du diese Ordnerstruktur mit new-item und kopierst deine Datei dorthin, fertig.

Grüße Uwe
Bitte warten ..
Mitglied: internet2107
21.10.2014, aktualisiert um 15:51 Uhr
Lieber Uwe.

Ich baue mir gerade den Code auch zu dieser Seite weiter zusammen.

Eine Frage hierzu.
Wie kann ich die folgende Dateibezeichnung per RegEx soweit beschneiden, dass aus:
T101361_2 (Test 2) (2281695) (2_3h) (19270236).mxa --> T101361_2
wird ?. Es soll also alles was nach dem Leerzeichen vor der ersten Klammer abgeschnitten werden ?
$string -replace '^\s ???????"

Danke im Voraus.
Bitte warten ..
Mitglied: colinardo
21.10.2014, aktualisiert um 16:14 Uhr
z.B. so
$string.Split(" (")[0]
oder so
([regex]'^([^\s\(]+)').Match($string).Value
oder so
$string -replace '^([^\s\(]+).*','$1'
Grüße Uwe
Bitte warten ..
Mitglied: internet2107
21.10.2014 um 19:44 Uhr
Danke für die Antwort oben. Ich komme meinem Ziel näher.
Jedoch muss hier in diesem Code noch irgendwo ein Fehler enthalten sein:

01.
$path = "C:\Temp\test_dat\a" 
02.
$path_pdf = "C:\Temp\test_dat\pdf" 
03.
$path_ziel = "C:\Temp\test_dat\PDF_A_" 
04.
$dateien = gci -path $path -include *.mxa, *.dra, *.log -recurse  
05.
 
06.
<# 
07.
 
08.
..hier findet die Umwandlung der gefilterten Dateien über Word nach PDF statt. 
09.
..$doc.SaveAs([ref]$path_pdf, [ref]17)  
10.
 
11.
#> 
12.
$file_old = $dateien.basename 
13.
$file_new = $file_old -replace '^([^\s\(]+).*','$1' 
14.
foreach ($folder in $file_new)  
15.
{  
16.
New-Item -Type directory $path_ziel$folder -Force 
17.
$a1 = "\*.pdf" 
18.
copy-Item $path_pdf$a1 $path_ziel$folder |  Where-Object  { $dateien -match $folder } 
19.
20.
 
Beschreibung:
Nachdem die gefilterten Dateien über Word als PDF exportiert worden sind, (Word wird zur speziellen Formatierung benutzt), liegen alle PDF zunächst in einem "Sammel"-Ordner. Zur besseren Übersicht soll aber eine Ordnerstruktur erstellt werden. Der Ordner hat jeweils genau denselben Namen wie die ersten Buchstaben der Datei.
Das klappt auch alles soweit.

Am Ende sollen aber die PDFs in die vom Namen passenden Ordner kopiert werden. Hier kopiert er aber aktuell immer alle PDFs in alle Ordner.
Im Klartext:
Es befindet sich am Ende ein PDF im Ordner: "C:\Temp\test_dat\pdf\T101361_2 (Test 2) (2281695) (2_3h) (19270236).pdf"
Dieses PDF soll aber nur in erstellten Ordner: "T101361_2" kopiert werden.
Jedoch befinden sich dort aktuell auch Dateien vom Namen: "T101361_5 (Test 2) (2281695) (2_3h) (19270236).pdf", obwohl die Benennung T101361_5 eigentlich in den Ordner "T101361_5" müsste....

Sieht jemand den Fehler ?
Bitte warten ..
Mitglied: colinardo
21.10.2014, aktualisiert um 23:38 Uhr
01.
$file_old = $dateien.basename 
02.
$file_new = $file_old -replace '^([^\s\(]+).*','$1' | select -unique 
03.
foreach ($folder in $file_new)  
04.
{  
05.
  New-Item -Type directory "$path_ziel\$folder" -Force 
06.
  copy-Item "$path_pdf\$folder*.pdf" "$path_ziel\$folder" 
07.
}
p.s. das angehängte where-object in deiner Zeile 18 ist ein ganz grober Fehler. Da hast du die Powershell und die Pipe noch nicht ganz durchblickt. Gefiltert werden kann immer nur vor einer Aktion ! In diesem Fall geht's aber auch ohne Filter via Wildcard im copy-Befehl.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell - Dateien aus verschiedenen Arrays - Attribute vergleichen (5)

Frage von Giffas zum Thema Batch & Shell ...

C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
Dateien im Ordner auslesen und umbennen (10)

Frage von jocheng zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...