PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : batchdatei soll dateinamen aus einem Verzeichnis in Variablen packen


Gast
2007-06-06, 13:48:42
Hi,

ich möchte, das eine Batch-datei ein bestimmtes Verzeichnis durchsucht und alle Dateinamen in einer Variable ablegt, dh. die erste Datei in eine Variable dann wird etwas gemacht und dann die zweite Datei in die selbe Variable und es wird erneut was gemacht etc.

Ich hab alternativ auch schon darüber nachgedacht die Namen in einer TXT abzuspeichern, sozusagen ähnlich einem Array :) Mein Problem ist jetzt wie beweg ich eine Batchdatei dazu die Dateinamen in einem Verzeichnis schrittweise auszulesen damit ich die in eine variable packen kann.

Gast
2007-06-06, 14:44:13
ich hab eine mögliche lösung:

set i=.txt

dir /B \ | FIND /I "%i%"

der sucht im aktuellen Verzeichnis und gibt alle "*.TXT"-Dateien aus.

Das problem ist jetzt aber, das der natürlich alles auf einmal durchrattert und ich die einzelnen dateinamen nicht seperat abgreifen kann.

Gast
2007-06-06, 17:45:25
also ich habs jetzt soweit, das die einzelenen dateien im verzeichnis in eine TXT geschreiben werden und nun wollt ich die wieder auslesen´:


SET /A Zeile=0

REM Datei Zeilenweise auslesen
FOR /F "delims=" %%i IN ('TYPE Speicher.txt') DO (

ECHO %Zeile%
ECHO %i%
SET /A Zeile+=1
)



Problem ist aber das nichts aus der datei nichts gescheites rauskommt...

zeile ist immer null und i ist auch immer das selbe ... obwohl soviele durchläufe kommen wie zeilen in der speicher.txt sind.

Mr. Lolman
2007-06-06, 18:43:36
So müssts theoretisch funzen. Ist ein leicht abgeänderterTeil eines selbstgebastelten Batchscripts.


set /a zeilencounter=0
set /a abbruchcounter=0

:loop
set /a zeilencounter+=1
set /a abbruchcounter+=1
find /n /v "" speicher.txt |find "[%zeilencounter%]" > %temp%\1
for /f "tokens=2 delims=]" %%j IN (%temp%\1) DO set zeile=%%j

::Abbruchbedingung-Dateiende::

set check%abbruchcounter%=%zeile%
if %abbruchcounter%==2 set /a abbruchcounter=0
if "%check1%"=="%check2%" (
echo.
echo Dateiende erreicht
goto end
)
::aktuelle Zeile anzeigen::

echo %zeile%


goto loop
:end

ooAlbert
2007-06-07, 18:47:04
hm,

ich hab mal etwas rumprobiert set / var+=1 scheint grundlegend nicht zu gehen

Set /a var= %var + 1 klappt wiederum... in einer forschleife (/F) aber nicht, warum auch immer. Letzendlich ist mein Zeilenindex vollkommen sinnlos da es keinerlei einfluß auf irgendetwas hat.

Ich hab das programm jetzt mal ohne "echo off" laufen lassen und die forschleife schien doch richtig zu gehen aber die variable %%i wird nicht an die anderen variablen weitergegeben, auch wenn es so aussieht.

die schleife sieht momentan so aus:


PUSHD %Pfad1%
REM Datei Zeilenweise auslesen
FOR /F "delims=" %%i IN ('TYPE Speicher.txt') DO (

ECHO %%i

REM SET Zeile =%%i
SET Quelle=%%i
SET Ziel=%%i
echo %Ziel% <= ergibt ein leeres Feld, dh. %%i ist nicht an %Ziel übertragen worden obwohl es so aussah
START /min /wait pdftk "%Stempel%" background "%Pfad2% %Quelle%" output "%Pfad3% %Ziel%"
REM SET /a Zeile +=1
)
POPD

Mr. Lolman
2007-06-08, 12:33:13
So wie du das machen willst, brauchst du die verzögerte Variablenerweiterung. Kann man mit "cmd /v" aktivieren. Das von mir oben gepostete Proggi umgeht die verzögerte Erweiterung, ist aber komplizierter. Mit "cmd /v" jedoch gehts folgendermassen:


@echo off
set zeile=
for /f "delims=" %%i IN (speicher.txt) DO (
set zeile=%%i
echo !zeile!
)

Gast
2007-06-08, 12:44:51
ja das hab ich mittlerweile auch rausgefunden :) schon albern das man für sone simple funktion erst so tief in die trickkiste greifen muß.

mal noch eine andere frage:

kann man eigentlich den inhalt einer variable nach einem bestimmten zeichen prüfen ohne das erst in einer TXT zwischen zu speichern?

Ich hatt da an FindSTR gedacht aber scheinbar geht das nicht direkt oder ich versteh die notation falsch.

Mr. Lolman
2007-06-08, 13:10:45
Ja kann man:


echo "!zeile!"|find "zeichen"

ooAlbert
2007-06-08, 13:34:22
ich hab das mal probiert:


@echo off
set "a=c:\programme\ziel"
REM find "\" %a% <= wenn ich das benutze kommt Errorlevel 1 und 2
findstr /I /E /C:"\" %a% <=hängt sich das prog weg

if errorlevel 0 echo ok0
if errorlevel 1 echo nichts1
if errorlevel 2 echo nichts2
pause


Es geht mir nämlich darum zu prüfen ob das letze zeichen in %a ein "\" oder nicht wenn nicht soll das angefügt werden. Dacht jetzt halt das sowas ohne for-schleife geht ...

Mr. Lolman
2007-06-08, 14:26:19
Ich wüsst jetzt nichtmal die korrekte Syntax, wie man das mit ner FOR-Schleife machen kann. :|

PHuV
2007-06-08, 14:39:07
Warum installierst Du nicht so etwas wie cygwin mit einer bash. Unter Cygwin steht Dir dann auch eine ksh, csh, tcsh usw. zur Verfügung. Damit bekommst Du Dein Problem viel besser gelöst und hat viel mehr Möglichkeiten als mit einer command.com.

Nachteil: Man müßte Unix bzw. Unix-Shell-Kenntnisse haben, dann würde der code ganz einfach so aussehen:



#!/bin/ksh

a="c:/programme/ziel"

for dateiname in `ls`
do
echo "Dateiname $dateiname gefunden"

grep $a $dateiname >/dev/null
rc=$?
if [ $rc -eq 0 ];then
echo "Suchstring gefunden
fi
:
done


Ebenso kann man wunderbar mit perl arbeiten, hier gibt es auch eine Menge Möglichkeiten, diverse Probleme der Batchprogrammierung einfach zu lösen.

Mr. Lolman
2007-06-08, 18:26:50
Achwas. Mit Batch geht das auch ganz simpel X-D

set "a=c:\programme\ziel"
echo %a%|findstr /e \

PHuV
2007-06-08, 20:08:12
Achwas. Mit Batch geht das auch ganz simpel X-D

set "a=c:\programme\ziel"
echo %a%|findstr /e \


Ach, und wo ist die for-schleife (aber bittschön ohne eine Zwischendatei, gelle)? X-DX-D

Mr. Lolman
2007-06-08, 21:09:30
Ach, und wo ist die for-schleife (aber bittschön ohne eine Zwischendatei, gelle)? X-DX-D

braucht man ja nicht *g*

Findstr ist idF auch nur notwendig, wenn man mit Errorlevel arbeiten will.


echo %a:~-1%

gibt zB das letzte Zeichen der Variable a aus.

Will man in der gesamten Variable nach nem String suchen, kann man das zB mit ner Variablenerweiterung machen:


set test=c:\programme\
set test=%test:[Suchstring]=,[Suchstring],%
for %%i in (%test%) do if "%%i"=="[Suchstring]" echo String gefunden

ooAlbert
2007-06-08, 22:17:34
ich hab mal das ausprobiert:

SET /P "a=eingeben:"
echo %a% | findstr /e \

if errorlevel == 1 echo 1
if errorlevel == 2 echo 2
if errorlevel == 0 echo 0

ich bekomm immer Level 1,0 egal was ich eingebe; dürfte nicht immer nur ein Errorlevel erscheinen je nach dem ob was gefunden wurde oder nicht, bzw. 0 wenn "\" vorhanden und 0,1 bei "\" nicht vorhanden?


Was übrigens auch geht wäre einfach generell einen zusätzlichen backslash anzufügen ;) da die konsole dopplete Backslash als einen interpretiert.

Set "a=%a%\"

Mr. Lolman
2007-06-09, 06:15:25
ich hab mal das ausprobiert:

SET /P "a=eingeben:"
echo %a% | findstr /e \

if errorlevel == 1 echo 1
if errorlevel == 2 echo 2
if errorlevel == 0 echo 0

ich bekomm immer Level 1,0 egal was ich eingebe; dürfte nicht immer nur ein Errorlevel erscheinen je nach dem ob was gefunden wurde oder nicht, bzw. 0 wenn "\" vorhanden und 0,1 bei "\" nicht vorhanden?

Du darfst nach %a% keinen Abstand machen ;)


Was übrigens auch geht wäre einfach generell einen zusätzlichen backslash anzufügen ;) da die konsole dopplete Backslash als einen interpretiert.

Set "a=%a%\"

Das geht natürlich auch. Korrekter wärs trotzdem so ;):
if %a:~-1% NEQ \ set "a=%a%\"

ooAlbert
2007-06-14, 00:31:07
ich nochmal ... ich hab jetzt paar tests mit meiner routine gemacht und festgestellt das leute beim eingeben gern mal die dateiendungen vergessen...

Das hier:
if %a:~-1% NEQ \ set "a=%a%\"

prüft ja auf das letzte zeichen udn wenn ich den wert -1% erhöhe jedes davorstehende. Jetzt wollt ich die vier if-abfragen mit einem logischen-und verknüpfen damit das weniger schreibkram wird aber das gibts im batch wohl nicht.

Verketten mit | im if-abfrageblock geht auch nicht.
eine forschleife wäre wohl auch sinnlos da sich der index und das such-zeichen ändert.

findstr und find versteh ich irgendwie nicht, weil ich da nie eine sinnvolle ausgabe bekomme oder was weiß ich wie das gedacht ist.

ICh dacht nämlich erst an sowas:
if %a% | findstr /e ".txt" notexists Set "a=%a%.txt"

Mr. Lolman
2007-06-14, 02:03:11
if %a:~-4% NEQ .txt set "a=%a%.txt" ;)