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

Finden von (fast) gleichen Dateinamen, Ändern von Dateinamen

Frage Entwicklung Batch & Shell

Mitglied: internet2107

internet2107 (Level 1) - Jetzt verbinden

15.10.2014, aktualisiert 18.10.2014, 1209 Aufrufe, 8 Kommentare, 3 Danke

Ich habe leider mal wieder eine etwas knifflige Sache.

Aktuell suche ich in Verzeichnissen nach Dateien mit gleichen Namen und erstelle daraus eine neue Datei.
In meinem Fall suche ich nach _used.dat Dateien die vom Dateinamen genauso sind, wie xlsb-Dateien.

Nun kommt aber folgendes Problem dazu, dass in den neuen .used-dat Dateien Änderungen hinzugekommen sind, die aber nun wieder entsprechend angepasst werden sollen, damit am Ende wieder das (wie bisher) selbe Ergebnis bei rauskommt.

Mit anderen Worten.
Bisher gibt es z.B. in einem Verzeichnis 2 Dateien:

output_2 (file 2) (2238269xxx) (2_3d) (19270250)_USED.DAT
output_2 (file 2) (2238269xxx) (2_3d) (19270250).xlsb

In dem Code unten sucht er nach den Dateien, vergleicht diese und wenn beide denselben Namen haben, wird entsprechend daraus eine (neue) xlsb-Datei gemacht.


Nun aber hat sich die Ausgabe geändert. Die Dateien sehen nun so aus:

output-2 (file 2) (2238269xxx) (2-3d) (19270250) (05282014)_USED.DAT
output_2 (file 2) (2238269xxx) (2_3d) (19270250).xlsb

Wie man sieht, unterscheiden sich die beiden Dateien nun soweit, dass in der neuen "dat-Datei" das (-)-Zeichen gegen einen (_) getauschen werden muss und dazu die letzte Klammer mit der Zahl wieder raus muss.
Da die Zahl in der Klammer sich ändert, wäre eine Löschung vor dem "_used.dat" bis zum Ende der nächsten Klammer perfekt.

Kann mir hier jemand helfen ?

01.
		 
02.
$DATDateien = Get-ChildItem -Path $path -include *_USED.DAT -recurse 
03.
		 
04.
		$XLSBDateien = Get-ChildItem -Path $path -include *.xlsb -recurse 
05.
				 
06.
		$excelFiles = ForEach ($xls in $DATDateien) 
07.
08.
			ForEach ($xlsb in $XLSBDateien) 
09.
10.
				If ($xls.BaseName -eq $xlsb.BaseName) 
11.
12.
					$xlsb 
13.
14.
15.
		}
Mitglied: colinardo
15.10.2014, aktualisiert 18.10.2014
Hi,
weis nicht ob ich es richtig interpretiert habe aber das ließe sich so machen:
wird entsprechend daraus eine (neue) xlsb-Datei gemacht.
was du damit meinst, ob umbenennen oder kopieren konnte ich nicht interpretieren. denke aber mit unten stehendem Code solltest du dein Problem lösen können.
01.
$path = 'c:\deinPfad' 
02.
dir $path -Include '*.xlsb' -Recurse | %{ 
03.
    # passende DAT Datei suchen 
04.
    $dat = dir "$path\$($_.BaseName.Replace('_','-'))*_USED.DAT" -Recurse | select -First 1 
05.
    # wenn eine zur xlsb-Datei passende DAT-Datei gefunden wurde 
06.
    if ($dat){ 
07.
        write-host "Für folgende Datei wurde eine USED-DAT gefunden:"$_.FullName 
08.
09.
}
Grüße Uwe
Bitte warten ..
Mitglied: internet2107
15.10.2014 um 15:18 Uhr
Hallo lieber Uwe,

dank dir erstmal für die schnelle Antwort.
Werde ich gleich mal ausprobieren.
Wichtig ist nur, dass die Umbenennung der "dat" Datei nicht auf File-Ebene passieren darf, es dürfen also nicht die Originaldateien im Ordner umbenannt werden, sondern lediglich in einer Art Variable, aus der dann letztendlich eine xlsb wird.

Ich schaue gleich mal.

Danke dir erstmal!!!
Bitte warten ..
Mitglied: internet2107
16.10.2014, aktualisiert um 09:59 Uhr
Guten Morgen,

ich hatte nun endlich Zeit das mal genau zu testen, jedoch macht er noch nicht genau das, was er soll, oder mir fehlt der Kaffee um den Wald vor lauter Bäumen zu sehen ??

Dein Script klappt soweit, dass er den Namen der dat-Datei entsprechend ändert, indem Fall die nicht gewünschte Klammer mit der Zahl entfernt, ebenso aus den (-)-Zeichen ein (_)-Unterstrich macht.
Ebenso die xlsb Datei mit der dat-Datei vergleicht und auch entsprechend die jeweils richtige filtert.

Um es noch mal etwas zu verdeutlichen.
Bisher hat er in diesem Ordner immer nach xls-Dateien gesucht, dann die Endung .xls entfernt und den Namen mit der im selben Ordner befindlichen xlsb-Datei verglichen. War der Name beider Dateien derselbe, hat er die xls-Datei genommen und daraus über Excel einen Ausdruck generiert.
Leider sind nun die xls-Dateien rausgefallen und wurden durch die _used.dat Dateien "ersetzt". Die _used.dat Dateien haben aber nun den Unterschied, dass sie zuerst ein (-)Zeichen, anstatt ein Unterstrich haben, dazu hat die bekannte Klammer mit Zahlen und die Bezeichnung "_used".

Am Ende erstellt das Script aus der xlsb-Datei einen Ausdruck.

Was aber noch nicht ganz sauber klappt, ist:
- er schreibt im Host, dass er 2 Dateien gefunden hat, er druckt dann aber 9x nur einer der beiden xlsb Dateien aus.

Schaue ich im Ordner nach, liegen dort insgesamt 9 dat-Dateien, davon 8x = _used.dat und 1x = .dat
Aber nur 2 xlsb-Dateien.
Richtig wäre aber, indem er nur die beiden dat-Dateien nimmt, die auch vom Namen mit den xlsb-Dateien übereinstimmen. Vielleicht habe ich heute Morgen noch Tomaten auf den Augen den Fehler zu sehen, darum paste ich mal das soweit geänderte und passende Script:

01.
 
02.
$path = $folder.Self.Path 
03.
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type] 
04.
		 
05.
	 
06.
		# zeige nur _used.DAT Dateien 
07.
		$DATDateien = Get-ChildItem -Path $path -include *.dat -recurse 
08.
		# zeige nur XLSB Dateien 
09.
		$XLSBDateien = Get-ChildItem -Path $path -include *.xlsb -recurse 
10.
				 
11.
		# Für jede *_used.dat Datei in der Liste (Array) wird etwas gemacht 
12.
		$excelFiles = ForEach ($_used_dat in $DATDateien) 
13.
14.
			dir $DATDateien | ForEach { 
15.
				# passende DAT Datei suchen 
16.
				$dat = dir "$path\$($_.BaseName.Replace("_","-"))*_USED.DAT" -Recurse | select -First 1 
17.
				# wenn eine zur xlsb-Datei passende DAT-Datei gefunden wurde 
18.
				if ($dat) 
19.
20.
					# DAT Name anpassen 
21.
					$newDATName = $dat.Name -replace '\s*\(\d+\)_USED.DAT$', '' 
22.
					write-host 'Passende DAT-Datei gefunden: '$dat.Fullname 
23.
					$newDATName_ready = $newDATName.Replace("-", "_") 
24.
					write-host 'Geänderter Name der DAT-Datei: '$newDATName_ready 
25.
					Write-Host $_used_dat 
26.
27.
28.
			 
29.
			 
30.
			# Für jede *.xlsb Datei in der Liste (Array) wird etwas gemacht 
31.
			ForEach ($xlsb in $XLSBDateien) 
32.
33.
				# vergleichen ob die Aktuell verarbeitete *_used.dat Datei den selben Namen hat 
34.
				# wie die Aktuell verarbeitete *.xlsb Datei 
35.
				If ($newDATName_ready -eq $xlsb.BaseName) 
36.
37.
					# passende Datei ausgeben 
38.
					$xlsb 
39.
40.
41.
42.
		 
43.
		 
44.
		$objExcel = New-Object -ComObject excel.application 
45.
		$objExcel.visible = $false 
46.
		 
47.
			$buttonStudieAuswahl.Enabled = $false 
48.
			$buttonStartJob.Enabled = $false 
49.
			$buttonPDFaErzeugen.Enabled = $false 
50.
			$buttonexit.Enabled = $false 
51.
		foreach ($wb in $excelFiles) 
52.
53.
		# ab hier werden die Ausdrucke generiert, nachdem sie in Excel formatiert wurden. 
54.
 
Bitte warten ..
Mitglied: colinardo
16.10.2014, aktualisiert um 11:47 Uhr
für mein Script benötigst du nur eine Schleife, nämlich nur über die xlsb-Dateien.
Diese Zeile:
$dat = dir "$path\$($_.BaseName.Replace("_","-"))*_USED.DAT" -Recurse | select -First 1 
sucht dann dazu die passende DAT zur xlsb heraus. Du machst es bei dir doppelt gemoppelt mit zwei Schleifen, die sind dann überflüssig!
Bitte warten ..
Mitglied: internet2107
18.10.2014, aktualisiert um 10:21 Uhr
Hi lieber Uwe,

sorry, dass ich mich erst wieder heute melde.
Wie gesagt funktioniert dein Script ja auch soweit, aber dennoch noch mal:

Ist-Stand:
Dein Script gibt NUR!!! die DAT-Dateien aus, was aber nicht der Fall sein soll. Dein Script ändert dazu zuviel, löscht zuviel weg, was es nicht soll.

Soll-Stand:
Es sollen NUR!! die passenden Xlsb-Dateien ausgegeben werden, die zum jeweiligen Namen der DAT-Datei passen.
Es soll nur die letzte Klammer von hinten entfernt werden.


In dem jeweiligen Suchordner befinden sich bis zu 10.000 Dateien. Diese werden von einer Maschine ausgeworfen. Durch das Filtern von "xlsb" und "_used.dat" schränken wir die Suche schon mal sehr groß ein, fallen mehrere Tausend dabei raus..
Dennoch gibt es aber z.B. eine _used.dat-Datei mit dem Namen:

T101361-3 (Test 3) (2281698) (2-3h) (19270243) (05282014)_USED.DAT
T101361-3 (Test 3) (2281698) (2-3h) (19270243) (routine) (05282014)_USED.DAT
T101361-3 (Test 3) (2281698) (2-3h) (19270243) (k) (05282014)_USED.DAT

dazu die jeweiligen xlsx-dateien:

T101361_3 (Test 3) (2281698) (2_3h) (19270243).xlsb
T101361_3 (Test 3) (2281698) (2_3h) (19270243) (routine).xlsb
T101361_3 (Test 3) (2281698) (2_3h) (19270243) (k).xlsb

Wichtig ist also, dass NUR!! die letzte Klammer und deren Inhalt von hinten aus gerechnet entfernt wird.
Nehme ich dein aktuelles Script, wird auch die (routine) oder das (k) mit entfernt???

Und letztendlich soll nicht die DAT-Datei weiter verarbeitet werden, sondern nur die XLSB.
In Beispiel oben sollte im Idealfall eine Ausgabe der 3 xls-Dateien ausgegeben werden, dann erfolgt ein Druck.

Das Umbenennen der DAT-Datei usw. funktiniert ja auch in deinem Script. Dieses Umbenennen erfolgt, oder soll, ja nur "virtuell" erfolgen, damit ein Namenvergleich zwischen der jeweiligen _used.dat und der xls-Datei erfolgen kann, um so die xls-Datei auszugeben.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 18.10.2014, aktualisiert um 10:36 Uhr
Zitat von internet2107:
Wichtig ist also, dass NUR!! die letzte Klammer und deren Inhalt von hinten aus gerechnet entfernt wird.
Nehme ich dein aktuelles Script, wird auch die (routine) oder das (k) mit entfernt???
Nein das tat es nicht ist eine Regular Expression dir nur das letzte Klammernpaar entfernte.
Und letztendlich soll nicht die DAT-Datei weiter verarbeitet werden, sondern nur die XLSB.
alle klar, dann sag das doch gleich
Ist oben nach deinen Wünschen angepasst ...
Bitte warten ..
Mitglied: internet2107
21.10.2014, aktualisiert um 11:42 Uhr
Lieber Uwe,

kann man das hier ebenso noch mal weiter eingrenzen ?

01.
dir $path -Include '*.xlsb' -Recurse | %{ 
02.
    # passende DAT Datei suchen 
03.
    $dat = dir "$path\$($_.BaseName.Replace('_','-'))*_USED.DAT" -Recurse | select -First 1
worauf ich hinaus will: alleine das Wort: -filter ist mehr als 10x so schnell, als -include.
Man nehme ein Ordner, indem sich wie bekannt mehr als 10.000 Dateien befinden, davon alleine 1000 _used.dat und 1800 .xlsb
Diese Dateien liegen im Netz. Alleine das Vergleichen der Dateien dauert Ewigkeiten...

kann man das auch auf das Wort _used.dat filtern ?

also im Endeffekt so etwas wie:

01.
dir $path -filter '*.xlsb' -Recurse | %{ 
02.
    # passende DAT Datei suchen 
03.
    $dat = dir "$path -filter \$($_.BaseName.Replace('_','-'))*_USED.DAT" -Recurse | select -First 1 
04.
 
Bitte warten ..
Mitglied: colinardo
LÖSUNG 21.10.2014, aktualisiert um 11:56 Uhr
Klar kannst du machen
01.
dir $path -filter '*.xlsb' -Recurse | %{ 
02.
    # passende DAT Datei suchen 
03.
    $dat = dir $path -filter "$($_.BaseName.Replace('_','-'))*_USED.DAT" -Recurse | select -First 1
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(4)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
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 ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (17)

Frage von Unwichtig zum Thema Netzwerkmanagement ...