anarchator
Goto Top

Batchfile, string mit findstr suchen und Dateiname erhalten, wo string vorkommt

Hi Leute,

habe in "c:\ordner" viele .json Dateien.
Mit folgendem Code kann ich prüfen, ob das aktuelle Tagesdatum enthalten ist, das wäre heute gemäß folgender Definition z. B. dann "2023-01-31"

set yyyymmdd=%date:~6,4%-%date:~3,2%-%date:~0,2%
findstr /m "%yyyymmdd%" c:\ordner\*.json  

Das funktioniert soweit. ABER:
Ich brauche für die weitere Verarbeitung eine Ausgabe von dem Dateinamen, in welchem der String gefunden wurde. Falls der String in mehreren Dateien gefunden wurde, am besten die neueste Datei.
Hat jemand einen Tipp?

Content-ID: 52508976157

Url: https://administrator.de/forum/batchfile-string-mit-findstr-suchen-und-dateiname-erhalten-wo-string-vorkommt-52508976157.html

Ausgedruckt am: 22.12.2024 um 16:12 Uhr

11078840001
Lösung 11078840001 31.01.2024 aktualisiert um 16:56:52 Uhr
Goto Top
@echo off
set yyyymmdd=%date:~6,4%-%date:~3,2%-%date:~0,2%
for /f "delims=" %%a in ('findstr /lm "%yyyymmdd%" "c:\ordner\*.json"') do echo %%a  
Tutorial zur FOR-Schleife

Oder gleich mit der Kraft-Muschel
Get-ChildItem "c:\ordner\*.json" -File | sort LastWriteTime -Descending | Select-String -Pattern (Get-Date -F "yyyy-MM-dd") -SimpleMatch | select -First 1 -ExpandProperty Path  
anarchator
anarchator 31.01.2024 um 17:00:23 Uhr
Goto Top
funktioniert leider nicht ->
Der Befehl "findstr" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
anarchator
anarchator 31.01.2024 um 17:04:00 Uhr
Goto Top
vielen Dank auch für den Powershell-Code.
Ich würde es gerne ohne Powershell gelöst bekommen. Am liebsten hätte ich als Ergebnis eine Variable, welche als Wert den Dateinamen enthält, in welchem der gesuchte String vorkommt.
11078840001
11078840001 31.01.2024 aktualisiert um 17:12:27 Uhr
Goto Top
funktioniert leider nicht ->
Klappt hier im Test ohne Probleme, hast du einen Fehler beim Kopieren oder Anpassen gemacht
Am liebsten hätte ich als Ergebnis eine Variable, welche als Wert den Dateinamen enthält, in welchem der gesuchte String vorkommt.
Einfach statt dem echo am Ende ein set mit deiner Variablen benutzen in %%a steht der Name ja ergo hast du ja eigentlich schon eine Variable 🙃.
........... do set "myvar=%%a"  
anarchator
anarchator 31.01.2024 um 17:17:23 Uhr
Goto Top
stimmt!

So funktioniert es:

@echo off
set yyyymmdd=%date:~6,4%-%date:~3,2%-%date:~0,2%
for /f "delims=" %%a in ('findstr /lm "%yyyymmdd%" "c:\ordner\*.json"') do echo %%a    
pause
Ergebnis ist dann:
c:\ordner\2024-01-31_11104.5.json

Du hast also recht, es funktioniert! TAUSEND DANK!
Mein Fehler war folgender: Ich wollte den Pfad über eine Variable laufen lassen:

path=c:\ordner

und dann

for /f "delims=" %%a in ('findstr /lm "%yyyymmdd%" "%path%\*.json"') do echo %%a    

Und das geht nicht. Muss den Pfad nicht unbedingt vorher über Variable definieren.
11078840001
11078840001 31.01.2024 aktualisiert um 17:19:59 Uhr
Goto Top
path=c:\ordner
Autsch niemals den Namen path als Variable überscheiben ! Denk mal nach warum face-wink.
https://ekiwi-blog.de/19215/path-variable-in-windows-konfigurieren-und-b ...
anarchator
anarchator 31.01.2024 um 17:25:02 Uhr
Goto Top
oopsie, wie dumm von mir.
Alles klar!
11078840001
Lösung 11078840001 31.01.2024 aktualisiert um 17:32:20 Uhr
Goto Top
Ach ja noch vergessen, falls es mehrere Dateien gibt nimmt das hier immer die neueste (nach Dateidatum)
@echo off
set yyyymmdd=%date:~6,4%-%date:~3,2%-%date:~0,2%
set "ordner=c:\ordner"  
set "newest="  
for /f "delims=" %%a in ('dir /b /a-d /o-d "%ordner%\*.json"') do findstr /l "%yyyymmdd%" "%ordner%\%%a" >nul && (if not defined newest set "newest=%ordner%\%%a")  
echo %newest%
anarchator
anarchator 31.01.2024 um 17:38:40 Uhr
Goto Top
perfekt!
Letzte Frage:
Am Ende des ganzen soll die Datei hochgeladen werden, z. B. so:

winscp.com" /command "open ftp://%username%:%password%@%host%" "put %newest%" "exit"  

Das funktioniert auch. Aber natürlich wird die Datei so hochgeladen, wie sie eben heißt. Sie soll aber einen anderen Namen bekommen, sagen wir "datei.json".
Wie kann man das erzielen?
11078840001
11078840001 31.01.2024 aktualisiert um 17:43:48 Uhr
Goto Top
Sie soll aber einen anderen Namen bekommen, sagen wir "datei.json".
https://winscp.net/eng/docs/scriptcommand_put

put <file> [ [ <file2> ... ] <directory>/[ <newname> ] ]

............ "put %newest% ./datei.json" "exit"  
anarchator
anarchator 31.01.2024 um 17:45:33 Uhr
Goto Top
sorry, ich bin da offenbar zu doof, das anzupassen. Kannst Du mir helfen, wie o. g. Zeile,
also:

winscp.com" /command "open ftp://%username%:%password%@%host%" "put %newest%" "exit"    

genau lauten muss, damit die Datei als "datei.json" hochgeladen wird, und nicht mit dem eigentlichen Dateinamen?
11078840001
11078840001 31.01.2024 aktualisiert um 17:48:45 Uhr
Goto Top
Freitag ist erst übermorgen, steht doch oben! Das Ding da auf dem Hals hat im Normalfall eine Funktion face-big-smile
erikro
erikro 31.01.2024 um 17:53:03 Uhr
Goto Top
Moin,

Zitat von @abamakabra:
Get-ChildItem "c:\ordner\*.json" -File | sort LastWriteTime -Descending | Select-String -Pattern (Get-Date -F yyyyMMdd) -SimpleMatch | select -First 1 -ExpandProperty Path  

Warum so kompliziert?

get-childitem *.json -filter *$(get-date -format "yyMMdd")* -file  

gibt das gewünschte Ergebnis zurück. OK, muss noch auf die jüngste Datei gefiltert werden.

Liebe Grüße

Erik
11078840001
11078840001 31.01.2024 aktualisiert um 18:01:10 Uhr
Goto Top
Warum so kompliziert?
Weil ich es so verstanden habe das das aktuelle Datum innerhalb der Dateien enthalten sein soll nicht im Dateinamen
das hat er ja mit
findstr /m "%yyyymmdd%" c:\ordner\*.json
im Ursprungspost schon gemacht, findstr sucht hier in den Dateien. Ob die Datumsangaben im Dateinamen dazu korrelieren kann nur er sagen, im Ursprungspost stand nicht das Datumsangaben im Dateinamen stehen.
anarchator
Lösung anarchator 31.01.2024 um 17:55:49 Uhr
Goto Top
Ich danke euch allen vielmals, insbesondere Abamakabra!

Mein Problem ist damit zur vollsten Zufriedenheit gelöst! Hier nochmal mein abschließendes Batch:

@echo off
set host=mein.host.de
set username=meinftpuser
set password=meinpasswort
set yyyymmdd=%date:~6,4%-%date:~3,2%-%date:~0,2%
set "ordner=meinpfad"    
set "newest="    
for /f "delims=" %%a in ('dir /b /a-d /o-d "%ordner%\*.json"') do findstr /l "%yyyymmdd%" "%ordner%\%%a" >nul && (if not defined newest set "newest=%ordner%\%%a")    
"G:\Meine Ablage\!DoNotTouch!\winscp.com" /command "open ftp://%username%:%password%@%host%" "put %newest% ./test.json" "exit"  
anarchator
anarchator 31.01.2024 um 18:10:34 Uhr
Goto Top
hab doch noch eine Frage:
Angenommen, in keiner der Dateien findet sich der genannte String.
Dann soll der Upload mit winscp.com einfach geskipped werden.
Wie erzielt man das?
11078840001
11078840001 31.01.2024 aktualisiert um 18:29:44 Uhr
Goto Top
Zitat von @anarchator:

hab doch noch eine Frage:
Angenommen, in keiner der Dateien findet sich der genannte String.
Dann soll der Upload mit winscp.com einfach geskipped werden.
Wie erzielt man das?

if not defined newest (
    echo Keine Datei gefunden
    goto :eof
)
anarchator
anarchator 31.01.2024 um 19:54:25 Uhr
Goto Top
mega! Das ist jetzt so genial, jetzt kann ich was saucooles bauen face-smile
erikro
erikro 01.02.2024 um 09:07:41 Uhr
Goto Top
Zitat von @abamakabra:

Warum so kompliziert?
Weil ich es so verstanden habe das das aktuelle Datum innerhalb der Dateien enthalten sein soll nicht im Dateinamen
das hat er ja mit
findstr /m "%yyyymmdd%" c:\ordner\*.json
im Ursprungspost schon gemacht, findstr sucht hier in den Dateien. Ob die Datumsangaben im Dateinamen dazu korrelieren kann nur er sagen, im Ursprungspost stand nicht das Datumsangaben im Dateinamen stehen.

Achso. Das habe ich anders verstanden.