tralveller
Goto Top

Batch Aus Dateinamen nach bestimmten Zeichen kommende Zeichen als Variable speichern

Hallo,

ich versuche in Batch aus dem Dateinamen heraus ein bestimmtes Zeichen zu erkennen und die nachfolgenden 3 Zeichen als Variable zu sichern.

Hier ein Beispiel:

Dateinamen-Varianten:
TestlocalA19V.exe
TestA21.EXE
TestRemoteA19V.exe
Test.RemoteA19V.Exe


String welchen ich suche:
A

Variable, welche ich von Dateinamen heraus speichern möchte:
A19
A21
A19


Bisher bin ich nicht auf die Lösung gekommen face-plain

Hat jemand eine Idee?

Danke und Grüße
Tralveller

Content-ID: 392318

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

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

Kraemer
Kraemer 10.11.2018 um 18:58:17 Uhr
Goto Top
137808
137808 11.11.2018 aktualisiert um 14:54:22 Uhr
Goto Top
@echo off &setlocal
set "folder=c:\data"  
set "filter=*.exe"  
for /f "delims=" %%a in ('powershell -Executionpolicy ByPass -Noprofile -Command "dir '%folder%' -filter '%filter%' | ?{!$_.PSIsContainer -and $_.Basename -cmatch 'A\d{2}'} | %%{$matches}"') do echo %%a  
Friemler
Friemler 11.11.2018 um 16:43:56 Uhr
Goto Top
Hallo @tralveller,

teste mal folgendes (native Batch Script):

@echo off & setlocal

set "Marker=A"  
set /a MarkerLen=1
set /a ExtractLen=MarkerLen+2

set "FileNames=TestlocalA19V.exe TestA21.EXE TestRemoteA19V.exe Test.RemoteA19V.Exe"  

for %%a in (%FileNames%) do (
  call :ProcessFileName "%%~a"  
)

exit /b 0



:ProcessFileName
  set "OutStr="  
  set "InStr=%~n1"  
  set /a Idx=0

  :Loop
    call set "SubStr=%%InStr:~%Idx%,%ExtractLen%%%"  
    call set "StartStr=%%SubStr:~0,%MarkerLen%%%"  

    if "%SubStr%" equ "" goto :LoopEnd  

    if "%StartStr%" equ "%Marker%" (  
      set "OutStr=%SubStr%"  
      goto :LoopEnd
    )

    set /a Idx+=1
    goto :Loop
  :LoopEnd

  call :ProcessFile "%~1" "%OutStr%"  
exit /b 0


:ProcessFile
  echo %~1 =^> %~2
exit /b 0

Grüße
Friemler
Pedant
Pedant 11.11.2018 aktualisiert um 19:12:34 Uhr
Goto Top
Hallo tralveller,

die Kollegen haben Dir elegante und allgemeine Ansätze und Lösungen aufgezeigt.

Falls Dein Namensmuster aber immer so simpel ist, wie in Deinen Beispielen, kann Du auch einfacher an Ziel kommen.
Nimm den Dateinamen, behalte davon nur 8 Zeichen von rechts und davon dann nur 3 Zeichen von links.

@echo off

set dateiname=TestlocalB19V.exe
REM TestlocalA19V.exe
echo %dateiname%

set variable=%dateiname:~-8,8%
REM A19V.exe
echo %variable%

set variable=%variable:~0,3%
REM A19
echo %variable%

if "%variable:~0,1%"=="A" echo Beginnt mit A  
if not "%variable:~0,1%"=="A" echo Beginnt nicht mit A  

Den Transfer der Dateinamen in eine Variable müsstest Du dann noch mit einer for-Schleife erledigen.

Gruß Frank
tralveller
tralveller 12.11.2018 aktualisiert um 17:13:32 Uhr
Goto Top
Hallo zusammen,

vielen Dank an alle für die Ansätze.

Leider gestaltet sich der Dateiname doch "sehr dynamisch"...
Die angegebenen Dateinamen sollten nur als Beispiel dienen, aus welchem der String genau benötigt wird.
Es kann in der Tat nur das "A" im Dateinamen als Anhaltspunkt genommen werden.

Nach langem hin- und herüberlegen und einigen Versuchen konnte ich das Problem anders lösen.

Hier die Lösung:
@ECHO OFF
ECHO Save file name
REM Dateiname als Variable zwischenspeichern
for %%i in ("%cd%\*.exe") do set DATEI_NAME=%%~ni  
ECHO ^=^> File Name is "%DATEI_NAME%"  
ECHO\
ECHO Extract Version in file name
REM Beziehe Versionsnummer, welche im Dateinamen enthalten ist
REM Hierbei wird nach "A" gesucht, was ein eindeutiges Indiz dafür ist, dass die Versionsnummer im Dateinamen beginnt  
REM Nach A wird alles in eine Variable zwischengespeichert
FOR /F "tokens=2 delims=A EOL=;" %%a in ("%DATEI_NAME%") do SET DATEI_NAME_VERSION=%%a  
REM Schneide nach 2 Zeichen den Rest von der Variable ab, da die Version nach A zwei Zeichen nur 2 Zeichen enthält; teilweise sind nach den 2 Zeichen noch andere Zeichen angehangen, welche nicht benötigt werden
SET /A DATEI_NAME_VERSION=%DATEI_NAME_VERSION:~0,2% 2>&1
IF NOT DEFINED DATEI_NAME_VERSION (
	ECHO ^=^> Version Number could not correct defined..
	EXIT /B 1603
	)
ECHO ^=^> Version detected..
ECHO ^=^> Version is "%DATEI_NAME_VERSION%%"  
ECHO\

Danke vielmals an alle für die dennoch hilfreichen Vorschläge (kann man sicherlich in Zukunft wieder draufschauen face-smile)

Viele Grüße
Tralveller

P.S.: Damit wird die BIOS-Version (Altere Modelle, in welcher die Version noch mit A beginnt) der Dell BIOS-Update-Datei erkannt und wird später mit der aktuell auf dem Gerät installierten Version verglichen. Für die neuen Modelle (welche mit 1.X.X angegeben werden) habe ich eine andere automatische Erkennung erarbeitet.
Pedant
Pedant 12.11.2018 aktualisiert um 17:07:01 Uhr
Goto Top
Hallo tralveller,

Zitat von @tralveller:
Was haltet Ihr davon?
das kannst Du eigentlich besser beurteilen, soll heißen, wenn's tut was es soll, dann ist alles gut.

Ausgegeben wird nur die Versionsnummer der zuletzt verarbeiteten exe-Datei.
Falls mehrere in dem Ordner liegen sollten, kann das die Falsche sein.

Die Ausgabe ist lediglich 19 statt A19 wie anfangs eigentlich gewüscht war.
Wenn Du diesbezüglich Deine Wünsche geändert hast, dann passt's.

for %%i in ("%cd%\*.exe") do set DATEI_NAME=%%~ni
Das %cd%\ kannst Du Dir eigentlich sparen.
Auch so
for %%i in ("*.exe") do set DATEI_NAME=%%~ni
sucht die Batch im aktuellen Ordner des aktuellen Laufwerks.


Zitat von @tralveller:
Damit wird die BIOS-Version ... der Dell BIOS-Update-Datei erkannt und wird später mit der aktuell auf dem Gerät installierten Version verglichen.
Hast Du für die Ermittlung der installierten Bios-Version eine Lösung?
Falls nicht hätte ich etwas anzubieten:
Pedate: http://www.pedant.de/html/tools_pedate.php
Einsetzen könntest Du es in dem Fall so:
@echo off
pedate.exe ~biosversion /vo && call zavars.cmd && del zavars.cmd
set BiosVersion=%za-output%
echo Installiert ist die Bios-Version: %BiosVersion%

Gruß Frank
tralveller
tralveller 12.11.2018 um 17:50:00 Uhr
Goto Top
Ausgegeben wird nur die Versionsnummer der zuletzt verarbeiteten exe-Datei.
Falls mehrere in dem Ordner liegen sollten, kann das die Falsche sein.
Stimmt, aber ich erwarte, dass nur die neueste Version aktualisiert werden soll.
Ich prüfe auch, ob nur eine Datei in dem Verzeichnis vorhanden ist; wenn 0, 2 oder mehr Dateien vorhanden sind, breche ich ab.
Wenn es Modelle gibt, welche eine gewisse Mindest-Version benötigen, erstelle ich einen Unterordner, wo diese Mindest-Version abgelegt wird.
Damit erkennt man auch, dass der Unterordner mit der Mindest-Version immer da bleiben soll und im Hauptverzeichnis die Version aktualisiert werden soll, wenn man die neuen Versionen vom Hersteller herunterlädt.

Die Ausgabe ist lediglich 19 statt A19 wie anfangs eigentlich gewüscht war.
Wenn Du diesbezüglich Deine Wünsche geändert hast, dann passt's.
Stimmt, ich wollte nur den String anhand von A finden; zum Vergleichen machen sich Buchstaben aber nicht so gut face-big-smile

for %%i in ("%cd%\*.exe") do set DATEI_NAME=%%~ni
Das %cd%\ kannst Du Dir eigentlich sparen.
Das dient als einfaches Beispiel für Andere face-smile ich habe es mir angewöhnt mit "-Zeichen zu arbeiten, wenn man mal wieder Verzeichnisse mit Leerzeichen vorhanden sind..

Zitat von @tralveller:
Damit wird die BIOS-Version ... der Dell BIOS-Update-Datei erkannt und wird später mit der aktuell auf dem Gerät installierten Version verglichen.
Hast Du für die Ermittlung der installierten Bios-Version eine Lösung?
Falls nicht hätte ich etwas anzubieten:
Pedate: http://www.pedant.de/html/tools_pedate.php
Ich bevorzuge es, Boardmittel zu verwenden und da Windows selbst die Version kennt, frage ich es einfach in der Registry ab..
ECHO Detect current BIOS Version..
REM In der Registry wird die aktuelle BIOS-Version ausgelesen
FOR /F "TOKENS=3" %%i IN ('REG QUERY "HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS" /V "BIOSVersion"') DO SET BIOS_VERSION=%%i  
REM Prüfen, ob die BIOS-Version erkannt wurde
IF NOT DEFINED BIOS_VERSION (
	EXIT /B 1603
	)
ECHO ^=^> Current BIOS Version is "%BIOS_VERSION%"  
Warum sollte ich unnötig zusätzliche Programme einsetzen face-wink

Danke dir vielmals und Grüße
Tralveller
tralveller
tralveller 12.11.2018 um 18:19:53 Uhr
Goto Top
Damit wird die BIOS-Version ... der Dell BIOS-Update-Datei erkannt und wird später mit der aktuell auf dem Gerät installierten Version verglichen.
Hast Du für die Ermittlung der installierten Bios-Version eine Lösung?
Falls nicht hätte ich etwas anzubieten:
Pedate: http://www.pedant.de/html/tools_pedate.php
Dennoch sehr interessantes Tool face-smile
Pedant
Pedant 13.11.2018 um 10:17:17 Uhr
Goto Top
Hallo Tralveller,

Zitat von @tralveller:
for %%i in ("%cd%\*.exe") do set DATEI_NAME=%%~ni
Das %cd%\ kannst Du Dir eigentlich sparen.
Das dient als einfaches Beispiel für Andere face-smile ich habe es mir angewöhnt mit "-Zeichen zu arbeiten, wenn man mal wieder Verzeichnisse mit Leerzeichen vorhanden sind.
Nicht die Anführungszeichen meinte ich, sondern das %cd%\

Es stört nicht, aber es ist auch wirkungslos, da es zum aktuellen Verzeichnis des aktuellen Laufwerks erweitert wird, was exakt derselbe Pfad ist, der verwendet wird, wenn Du die Pfadangabe weglässt.
Hier gilt: ("%cd%\*.exe") = ("*.exe")
Wie gesagt, es stört nicht, lass es also drin oder nicht.
ich wollte jetzt nur auf das Missverständnis bezüglich der Anführungszeichen eingehen.


Zitat von @tralveller:
Ich bevorzuge es, Boardmittel zu verwenden und da Windows selbst die Version kennt, frage ich es einfach in der Registry ab.
'REG QUERY "HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS" /V "BIOSVersion"
Warum sollte ich unnötig zusätzliche Programme einsetzen face-wink
Ich habe hier u.a. einen Supermicro X8DTL mit Windows Server 2008 R2 Standard 64-bit, SP 1 (de-DE) [6.1.7601]
Der hat zwar den Reg-Zweig, aber der Schlüssel "BIOSVersion" ist nicht vorhanden.
Das Problem scheinst Du nicht zu haben, insofern ist alles gut.
Mit Pedate nutze ich für das Auslesen der Biosversion letztendlich auch nur Boardmittel und zwar WMI.
Mit Batch sähe das so aus:
wmic bios get SMBIOSBIOSVersion


Zitat von @tralveller:
Dennoch sehr interessantes Tool
Danke

Gruß Frank