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
Hat jemand eine Idee?
Danke und Grüße
Tralveller
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
Hat jemand eine Idee?
Danke und Grüße
Tralveller
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 392318
Url: https://administrator.de/contentid/392318
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
9 Kommentare
Neuester Kommentar
@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
Hallo @tralveller,
teste mal folgendes (native Batch Script):
Grüße
Friemler
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
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.
Den Transfer der Dateinamen in eine Variable müsstest Du dann noch mit einer for-Schleife erledigen.
Gruß Frank
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
Hallo tralveller,
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
Wenn Du diesbezüglich Deine Wünsche geändert hast, dann passt's.
Das
Auch so
sucht die Batch im aktuellen Ordner des aktuellen Laufwerks.
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:
Gruß Frank
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
%cd%\
kannst Du Dir eigentlich sparen.Auch so
for %%i in ("*.exe") do set DATEI_NAME=%%~ni
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?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.
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
Hallo Tralveller,
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:
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.
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:
Danke
Gruß Frank
Zitat von @tralveller:
Das
Das dient als einfaches Beispiel für Andere 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 for %%i in ("%cd%\*.exe") do set DATEI_NAME=%%~ni
%cd%\
kannst Du Dir eigentlich sparen.%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.
Warum sollte ich unnötig zusätzliche Programme einsetzen
Ich habe hier u.a. einen Supermicro X8DTL mit Windows Server 2008 R2 Standard 64-bit, SP 1 (de-DE) [6.1.7601]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
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
Danke
Gruß Frank