lox0805
Goto Top

Batch - Set Variable in einer FOR Schleife

Hallo.
Ich bin Anfänger und habe ein Problem in einem kleinen Sicherungsjob von Access DB.
Vielleicht könnt ihr mir helfen meine Batch zu optimieren.

Folgendes:
Ich möchte verschiedene Access Dateien auf ein ext. Laufwerk sichern und gleichzeitig komprimieren.
In einer Batch trage ich die Dateinamen und Pfade als Variable ein. Auch um die Batch klein zu halten.

Jetzt möchte ich mir für die Punkte 1, 4 und 5 (Beschreibung im Code) das Einfügen der Befehlszeilen für weitere Dateien (möglich datei001-datei999) sparen.
D.h. die Variablen "dateiNNN" und "dateiNNNp" sollten nacheinander abgearbeitet werden.
Soll heißen, nur eine Befehlszeile pro Verarbeitungs-Punkt für alle Variablen.
Verständlich genug?

Ist das möglich? Habe soetwas noch nicht gemacht.
Die For Schleife habe ich im Internet gefunden, komme aber mit den Erklärungen der Parameter nicht klar.


Hier der Code:
@echo off
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"  
set cziel=s:\AccessDBs

rem datei000   = Zu sichernde Datei
rem datei000p = Quellpfad der Datei

set datei001=AccessDB1.mdb
set datei001p=C:\Verz1\...\

set datei002=AccessDB2.mdb
set datei002p=C:\Verz2\...\

set datei003=AccessDB3.mdb
set datei003p=C:\Verz3\...\

set datei004=AccessDB4.mdb
set datei004p=C:\Verz4\...\

 
echo . Verarbeitung beginnt
echo ---------------------------------------------------------------
echo .
echo . 1. Sammeln und Sichern ALLER ACCESS DBs
echo ===============================================================
copy %datei001p%%datei001% %CZIEL%\
copy %datei002p%%datei002% %CZIEL%\
copy %datei003p%%datei003% %CZIEL%\
copy %datei004p%%datei004% %CZIEL%\

echo . 2. Gesicherte Access DBs komprimieren
echo ===============================================================
 FOR %%a IN ("%CZIEL%\*.mdb") DO %ACCESS% %%a /compact   


echo . 3. Access2007 Sicherheitswarunung unterdruecken (Prog. reg.exe)
echo ===============================================================
reg add "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security" /v VBAWarnings /t REG_DWORD /d 1 /f  


echo . 4. Registry Pfad anlegen (Prog. AddPath1.1), damit Access Runtime arbeiten kann (Prog. BoxWech2 erledigt den OK Klick)
echo   Voraussetzung fuer Punkt 5
echo =======================================================================================================
addpath /Path %datei001p%
addpath /Path %datei002p%
addpath /Path %datei003p%
addpath /Path %datei004p%


echo . 5. Access DB im Quelllaufwerk komprimieren (statt "Rueck"copy)  
echo ===============================================================
%access% %datei001p%%datei001% /compact
%access% %datei002p%%datei002% /compact
%access% %datei003p%%datei003% /compact
%access% %datei004p%%datei004% /compact

pause

Wie lässt sich das optimieren?????

Vielen Dank und Gruß.
Kommentar vom Moderator Biber am 25.05.2011 um 19:49:38 Uhr
Respekt. Der erste Beitrag eines neuen Mitglieds und Batch-Anfängers - super.
Herzlichst willkommen im Forum.

Content-Key: 166906

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

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: bastla
bastla 25.05.2011, aktualisiert am 18.10.2012 um 18:46:59 Uhr
Goto Top
Hallo Lox0805 und willkommen im Forum!

Wirf doch mal einen Blick in die "Nachbarschaft" ...

Grüße
bastla
Mitglied: Lox0805
Lox0805 25.05.2011 um 16:53:11 Uhr
Goto Top
Hallo und Danke.

Mein Code sieht von den Variablen her zwar etwas anders aus, aber das was ich will funktioniert. Auch wenn es gefummelt ist.
Einen Fehler bei der Registry Erstellung hab ich auch noch entdeckt... hat sich also gelohnt.

Wenn man weiß, was in der Nachbarschaft so los ist, und wonach man suchen muss ist es einfach.
Gut das es Nachbarn gibt face-smile

Vielen Dank !!!


@echo off
setlocal

set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"  
set cziel=s:\AccessDBs
set counter=10

set datei_p1=C:\Verz1\...\
set datei_1=%datei_p1%AccessDB1.mdb

set datei_p2=C:\Verz1\...\
set datei_2=%datei_p2%AccessDB2.mdb

set datei_p3=C:\Verz1\...\
set datei_3=%datei_p3%AccessDB3.mdb

 
echo . Verarbeitung beginnt
echo ---------------------------------------------------------------
echo .
echo . Sammeln und Sichern ALLER AKTIVEN ACCESS DBs
echo ===============================================================
for /l %%i in (1,1,%counter%) do (
  for /f "tokens=1* delims==" %%j in ('set datei_%%i') do (  
    copy %%k %CZIEL%\
  )
)


echo . Gesicherte Access DBs komprimieren
echo ===============================================================
FOR %%a IN ("%CZIEL%\*.mdb") DO %ACCESS% %%a /compact   


echo . Access2007 Sicherheitswarunung unterdruecken
echo ===============================================================
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations" /f  
reg add "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security" /v VBAWarnings /t REG_DWORD /d 1 /f  


echo . Registry Pfad anlegen, damit Access Runtime arbeiten kann
echo ===============================================================
for /l %%i in (1,1,%counter%) do (
  for /f "tokens=1* delims==" %%j in ('set datei_p%%i') do (  
    addpath /Path %%k
  )
)


echo . Access DB im Quelllaufwerk komprimieren
echo ===============================================================
for /l %%i in (1,1,%counter%) do (
   for /f "tokens=1* delims==" %%j in ('set datei_%%i') do (  
     %access% %%k /compact
   )
 )

pause
Mitglied: 60730
60730 26.05.2011 um 02:26:05 Uhr
Goto Top
moin und willkommen,


  • wieso nimmst du diesen Counter?
ich würde das etwas anders anpacken.

  • Nimm eine Steuerdatei für die Dateien und packe die nicht in die batch rein.
for /f %%a in (laufwerk:\pfad\dateiliste.txt) do call :processlines %%a

  • Dann mußt du vorher sicherstellen, dass es keine ldb zur Mdb gibt, bzw. sicherstellen, dass die mdb nicht geöffnet ist.
  • ein reines compact - damit habe ich meine besten Erfahrungen gesammelt - pack ein repair dazu - besser ist das
  • dann auch diese Batch am sinnvollsten auf dem Fileserver laufen lassen - Daten oder Netzwerkfehler kommt ganz gerne bei sowas und da braucht man es nicht wirklich.
  • deinen Schritt 5 kann ich nicht nachvollziehen - warum zweimal comprimieren, statt einmal und dann die Dateigröße vergleichen und bei nicht identischer Dateigröße zurück zum Server kopieren?

Gruß

Edit

In deinem Script fängst du ab 30 - genauer Zeile 32 mit dem comprimieren an.
Erst an Zeile 35 ff. klemmst du die Warnungen ab.
Und dann nochmal ab 50.

Access "Scripten" ist schon komplex genug - mach es dir nicht so kompiziert.

/Edit
Mitglied: Lox0805
Lox0805 26.05.2011 um 12:42:08 Uhr
Goto Top
Hallo.

Den "Counter" hab ich aus der Nachbarschaft von @bastla.

Das mit der zweiten Steuerdatei hört sich gut an, jedoch hab ich es lieber in einem Script wegen der Übersichtlichkeit. Ist für mich schon ok, wenn es keine Nachteile hat.

- Das mit der .ldb ist ein guter Hinweis. Da hätte ich jetzt nicht drauf geachtet. Aber ich kann eigentlich davon ausgehen, dass die DBs zu sind.
Ich könnte mir jetzt nur eine IF Frage bauen, dass ich eine Meldung bekomme, wenn die offen war, jedoch bringen tut mir das nichts, weil sichern muss ich so oder so irgendwann.

- Der /repair ist notiert. Hab ich nicht dran gedacht.

- Da ich mir die DBs von verschiedenen Resourcen zusammenklaube hab ich das schon zentralisiert.

- Habe ich erwähnt, dass ich Anfänger bin? face-smile

Der Einwand ist richtig, hab ich auch nicht drüber nachgedacht, aber ich weiß nicht wie das geht.
Daher erschienen mir die Varianten "Im Ziellw alles komprimieren und dann einfach alles drüberkopieren" oder "Alles im Quelllaufwerk kompieren" vom Zeitaufwand her gleich und am
einfachsten...?!

Im Netz habe ich folgendes zu Deiner Idee gefunden:
for %%F in (C:\Verz1\..\AccessDB1.mdb) do set groesse_a=%%~zF
for %%F in (S:\Verz1\..\AccessDB1.mdb) do set groesse_b=%%~zF

IF %groesse_a% neq %groesse_b%   copy  S:\Verz1\..\AccessDB1.mdb  C:\Verz1\..\AccessDB1.mdb

Aber ich weiß nicht wie ich das in meine Schleife kriege... ich muss ja mit wei Variablen arbeiten, und überschreibe mir den Inhalt von %%k.
Mit der FOR Schleife kenn ich mich absolut nicht aus !!!!


Zu den Reg Einträgen:
Doofe Access2007 Runttime mit den Sicherheitseinstellungen !
Stimmt, da ist auch noch ein Fehler drin.
Ich hab folgendes vergessen. Das Stammverzeichnis, dass immer da sein muss.
addpath /Path %cziel%

Ob die Reihenfolge richtig ist, ist so wie ich das beobachtet habe egal.
Das Programm AddPath legt mir die weiteren Keys ja automatisch neu an.

Was ich nur befürchte ist, dass das Programm Boxwech2 nicht funktioniert, wenn ich mich abmelde.
Dann hab ich ein Problem, und kann die Punkte 3 und 4 eh schenken, da man zwingend auf OK klicken muss. Sonst wird der Key in der Reg nicht angelegt, und die Runtime bringt eine Fehlermeldung.

Oder ich bau wieder eine Schleife mit der ich die Registry-Einstellungen durch die Batch einfüge.
Aber auch da ist für mich wieder eine kleine Hürde face-sad

So soll es in der Registry aussehen, und da muss auch wieder die Variable "datei_pN" rein:
[HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\Location0]
"Date"="26.05.2011 10:38"  
"Description"="Set by AddPath"  
"Path"="s:\\AccessDBs\\"  
"AllowSubfolders"=dword:00000001  


Aber erstmal Danke für Deinen Beitrag... face-smile
Mitglied: 60730
60730 26.05.2011 um 13:02:58 Uhr
Goto Top
Salü,

jetzt machst du mal 3 Sachen...

  • Tief luft holen
  • den Grünen haken wieder weg
  • und nochmal von vorne das ganze.
  • zu "theoretisch" nicht offen - falls eine DB eine eingebundene Tabelle einer anderen DB hat - ist die andere auch offen - obwohl es keine LDB dazu gibt.

in dem Zustand ungetesteter schnippsel - der ähnlich bei mir läuft
:parameter
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"   
set "cred= /user username /pwd password"  
set cziel=s:\AccessDBs

:schleife
rem in die Klammern die DBs reinmalen
for %%a in (C:\Verz1\.1.mdb\;C:\Verz2\2.mdb;C:\Verz3\3.mdb) do call :bastla  %~dpna

goto eof

:bastla
echo . Sammeln und Sichern ALLER AKTIVEN ACCESS DBs - die teoretisch nicht offen sind.
if exist %1.ldb echo Datei %1 offen>>errorlog.txt
if not exist %1.ldb (
                            echo ob oder ob nicht - jedesmal der Pfad neu gesetzt werden muß und du das ganze towuhabu überhaupt brauchst - entscheidest du - ich brauch das nicht.

                             %access% %1.mdb %cred% /repair
                             %access% %1.mdb %cred% /compact
                             copy %1 %cziel%\
)
eof


Gruß
Mitglied: Lox0805
Lox0805 26.05.2011 um 14:30:07 Uhr
Goto Top
Hallo.

- Tief Luft geholt
- Haken ist weg
- In mich hinein geweint

Vielleicht sitz ich auch schon zu lange davor.

Dein Script hat für mich einen Nachteil:
Die Pfade in die Klammer zu kloppen ist für mich zu unübersichtlich, weil es sind a) nicht nur drei DBs sondern X und b) es sind teils UNC Pfade dabei, die etwas länger sind.
Heißt, gibt eine schöne lange Reihe...kein Überblick... no chance.

Zudem gehst Du den anderen Weg. So wie ich es verstehe, verarbeitest Du die Datei im entfernten Verzeichnis (Quelle), und kopierst sie dann zur Sicherung ins Zielverzeichnis.
Das widerspricht Deinem Ansatz "...Daten oder Netzwerkfehler kommt ganz gerne bei sowas und da braucht man es nicht wirklich."
Was denn nu?
Ich zieh mir die Dinger, verarbeite sie und entscheide dann was damit passiert.

Und das towuhabu brauch ich, z.B. für die Access Runtime, da die sonst nicht arbeiten kann. Aber da brauch ich auch wieder nur den Pfad OHNE Dateinamen.
Also nützt mir hier das Klammerkloppen auch nichts. :quirlimkopf:

Und nu?
Mitglied: 60730
60730 26.05.2011 um 14:49:15 Uhr
Goto Top
Salü

  • nein - ich habe versucht - zwischen Tür und Angel aus deinem verschiedenen Ansätzen und meinem Script etwas zu zaubern - das aus einem Guss ist.
  • Wie geschrieben - jeder hat seine Ideen und sieht seine Probleme, die ein anderer Weg hätte....
  • ich gebe den originalen dateien auf dem Share z.B eine andere Suffix und kopiere eine wartedummy mdb dahin, damit ich sicher sein kann - das während des Jobs keiner drankommt.
  • in einem anderen Script - das auf einer anderen Kiste läuft - prüfe ich, ob nach 3 Stunden alle Dateien wieder "echt" sind - also wieder gegen die wartedummy ausgetauscht wurden - sind Sie das nicht - kicke ich das "erste" Script, Access - hole die umgesuffixten mdbs wieder zurück und schick mir ne Mail.

  • dann schreibt ja keiner, dass du es haaaaaargenauso machen mußt - da da geht auch...
for %%a in (
	c:\script\
	%windir%
	c:\
) do echo %%a

pause
C:\>C:\script\test\forbeispiel.cmd

C:\>for %a in (c:\script\ C:\WINDOWS c:\) do echo %a

C:\>echo c:\script\
c:\script\

C:\>echo C:\WINDOWS
C:\WINDOWS

C:\>echo c:\
c:\

C:\>pause
Drücken Sie eine beliebige Taste . . .

  • Dann und das ist Geschmackssache - ich mag es nicht, wegen einer neuen Datei oder einer, die nicht mehr abgearbeitet werden soll, das Script anzufassen und so dessen Dateidatum zu verändern.
  • Läuft bei mir aus irgendeinem Grund etwas nicht mehr und ich sehe - die cmd wurde verändert - hab ich erstmal ein Problem - oder besser eine falsche Fährte, wenns doch was anderes war.

Gruß
Mitglied: Lox0805
Lox0805 26.05.2011 um 15:58:13 Uhr
Goto Top
Hallo.

Ich hab jetzt folgendes probiert, und scheitere daran, dass irgend etwas an Deinem ungetestetem Script nicht stimmt...
Die forbeispiel.cmd funktioniert bei mir auch, jedoch wenn ich im eigentlichen Script "%~dpna" hinzufüge geht die Dos Box auf und wieder schnell zu.
Da helfen auch keine Pausen... ich seh nix.

Außerdem habe ich versucht den Code zu erweitern.
Da ich immernoch den Dateipfad UND den Dateinamen als Variable brauche habe im Internet geschaut und etwas gefunden.
Hierbei soll der Pfad angeblich vom Dateinamen getrennt werden. :wunschdenk:
Nur weiß ich nicht, ob ich es richtig anwende.


@echo off

:parameter
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"   
set cziel=s:\AccessDBs

:schleife

for %%a in (

     c:\Verz1\Access_DB1.mdb
     c:\Verz2\Access_DB2.mdb

) do call :bastla  %~dpna


goto eof

:bastla
if exist %1.ldb echo Datei %1 offen >>%cziel%\errorlog.txt
if not exist %1.ldb (
                            
			for %%i in ("%1") do set sPATH=%%~di%%~pi  
			for %%i in ("%1") do set sFILE=%%~ni%%~xi  

			set Path=%sPath:"=%  
			set File=%sFile:"=%  

                        rem %access% %1.mdb /repair
                        rem %access% %1.mdb /compact
                        rem copy %1 %cziel%\

			copy %Path%\%File %cziel%\
)

eof
pause


Was sagst Du dazu????

Gruß
Mitglied: 60730
60730 26.05.2011 um 16:13:19 Uhr
Goto Top
Zitat von @Lox0805:
Hallo.

Ich hab jetzt folgendes probiert, und scheitere daran, dass irgend etwas an Deinem ungetestetem Script nicht stimmt...
Die forbeispiel.cmd funktioniert bei mir auch, jedoch wenn ich im eigentlichen Script "%~dpna" hinzufüge geht die
Dos Box auf und wieder schnell zu.
Da helfen auch keine Pausen... ich seh nix.

Außerdem habe ich versucht den Code zu erweitern.
Da ich immernoch den Dateipfad UND den Dateinamen als Variable brauche habe im Internet geschaut und etwas gefunden.
Hierbei soll der Pfad angeblich vom Dateinamen getrennt werden. :wunschdenk:
Nur weiß ich nicht, ob ich es richtig anwende.


rem ungetstete Script immer ohne @echo off

:parameter
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"   
set cziel=s:\AccessDBs

:schleife

for %%a in (

     c:\Verz1\Access_DB1.mdb
     c:\Verz2\Access_DB2.mdb

) do call :bastla  %~dpna %~dpa %~nxa 


goto eof

:bastla
if exist %1.ldb echo Datei %1 offen >>%cziel%\errorlog.txt
if not exist %1.ldb (
                          

			set sPATH=%2
			set sFILE=%3
			set Path=%sPath:"=%  
			set File=%sFile:"=%  

                       echo %access% %1.mdb /repair
                       echo %access% %1.mdb /compact
                       echo copy %1 %cziel%\
   		       copy %Path%\%File% %cziel%\
)

eof
pause
> 


Was sagst Du dazu????
Zwischen Tür und Angel und irgenwie schon wieder ungetestet und leicht krumm...
Aus dem bauch heraus...

Starte eine Dosbox und dort wirfst du die Batch rein - nicht per doppleklickeritis starten - dann siehst du auch - wo er kleben bleibt...
Gruß

edit @Friemler face-wink
@ TO:
Der einzige Punkt, wo du %Path%\%File% benutzt ist doch copy %Path%\%File% %cziel%\
Das ist doch bereits %1
Mitglied: Friemler
Friemler 26.05.2011 um 16:14:49 Uhr
Goto Top
Hallo Lox0805,

beim Batchscript debuggen
  1. @echo off raus
  2. Script aus einem Konsolenfenster starten

Daten, die sich irgendwann mal ändern könnten (z.B. die Pfade zu den MDB's) am Anfang des Scripts in eine Variable schreiben (sozusagen einen Konfigurationsblock). In den Kopf der FOR-Schleife kommt dann die Variable. Erspart später unnötige Sucherei im Quellcode.

Sowas wie
sFILE=%%~ni%%~xi
lässt sich zu
sFILE=%%~nxi
zusammenfassen, ließt sich besser.

set Path=%sPath:"=%
set File=%sFile:"=%
Ist unnötig. Evtl. vorhandene Anführungszeichen wurden schon von den SET-Befehlen in den beiden FOR-Schleifen davor entfernt.

Gruß
Friemler
Mitglied: bastla
bastla 26.05.2011 um 16:24:50 Uhr
Goto Top
@t-mo & Friemler: Amen. face-wink
Da im Unterprogramm ja (derzeit) de facto nur eine Aktion erfolgt, wenn keine ".ldb" existiert, würde ich das eher so anlegen
@echo on & setlocal

:parameter
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"   
set cziel=s:\AccessDBs

for %%a in (

     c:\Verz1\Access_DB1.mdb
     c:\Verz2\Access_DB2.mdb

) do if exist "%%~dpna.ldb" (  
    echo Datei %%a offen >>%cziel%\errorlog.txt
) else (
    call :bastla  "%%a"  
)
pause
goto :eof

:bastla
rem %access% %1 /repair
rem %access% %1 /compact
copy %1 %cziel%\
goto :eof
oder ganz auf das (@T-Mo: originell benannte face-wink) Unterprogramm verzichten ...

Grüße
bastla
Mitglied: Lox0805
Lox0805 26.05.2011 um 16:27:14 Uhr
Goto Top
Hallo nochmal.

Jau, mit der cmd.exe gehts. :aumann:

Folgende Fehlermeldung:
Die folgende Verwendung des Pfadoperators zu Ersatzung eines Batchparameters
ist ungültig: %~dpna


Zu den Parametern:
Nein, die brauche den Pfad UND Pfad mit Dateiname.... einmal für die Runtime (die erwartet einen in der Registry den Pfad ohne Dateinamen) und dann für die anderen Jobs.

Der Code war noch nicht fertig, weil es nicht funktioniert / hat.

Gruß und Danke
Mitglied: bastla
bastla 26.05.2011 um 16:29:52 Uhr
Goto Top
@Lox0805
ist ungültig: %~dpna
Ist ja auch ein Batch - daher: %%~dpna
Nein, die brauche den Pfad UND Pfad mit Dateiname.... einmal für die Runtime (die erwartet einen in der Registry den Pfad ohne Dateinamen) und dann für die anderen Jobs.
... aber wozu in eigenen Variablen?

BTW: Da Du das ganze in einer Klammer abgehandelt hast, wäre auch noch "delayedExpansion" für die Verwendung der Variablen erforderlich ...

Grüße
bastla
Mitglied: Lox0805
Lox0805 26.05.2011 um 16:31:46 Uhr
Goto Top
Hallo.

Nein, es werden mehrere Befehle ausgeführt.
Nur mein Original Script ist anscheinend so crazy, dass sich TimoBeil etwas neues aus den Socken gezogen hat.

@all: So schnell wie jetzt die EMails mit Antworten kommen kann ich gar nicht schreiben face-smile face-smile
Mitglied: Lox0805
Lox0805 26.05.2011 um 16:43:28 Uhr
Goto Top
> set Path=%sPath:"=%
> set File=%sFile:"=%
> 
Ist unnötig. Evtl. vorhandene Anführungszeichen wurden schon von den SET-Befehlen in den beiden FOR-Schleifen
davor entfernt.



Hallo Friemler.

Tut mir leid, verstehe ich nicht.
Funktioniert auch nicht.

Von meinem Code:
copy %Path%\%File% %cziel%\
wird \cziel\* ausgegeben:
Fehler Das Sytem kann den angegebenen Pfad nicht finden.
Mitglied: Lox0805
Lox0805 26.05.2011 um 16:49:51 Uhr
Goto Top
@Lox0805
> ist ungültig: %~dpna
Ist ja auch ein Batch - daher: %%~dpna

Ja, daran lag es wohl face-smile

> Nein, die brauche den Pfad UND Pfad mit Dateiname.... einmal für die Runtime (die erwartet einen in der Registry den
Pfad ohne Dateinamen) und dann für die anderen Jobs.
... aber wozu in eigenen Variablen?

? Ich brauche Pfad UND Pfad mit Dateiname . Wie soll ich es erklären?
Ich gebe am Anfang des Scripts den Pfad mit Dateinamen an, brauche aber für einen Job nur den Pfad.
Ich wollte es mir einfach machen, und das was ich hab trennen.

Ich möchte bis zu fünf Aufgaben erledigen, nicht nur den Copy....


BTW: Da Du das ganze in einer Klammer abgehandelt hast, wäre auch noch "delayedExpansion" für die Verwendung
der Variablen erforderlich ...

Was ist das? Wo füge ich das ein???

Gruß
Mitglied: Friemler
Friemler 26.05.2011 um 16:58:24 Uhr
Goto Top
Hallo Lox0805,

das bezog sich auf die Zeilen 23-27 in Deinem letzten Code-Posting.

set Path=%sPath:"=%
ist eine Ersetzung von allen " durch nichts.

Außerdem überschreibst Du damit die interne PATH-Variable von CMD, verwende besser einen anderen Namen.

Da diese Zuweisungen in einem geklammerten Befehlsblock stehen, der ausgeführt wird, wenn
if not exist %1.ldb
wahr ist, und Du die veränderten Variableninhalte im selben Block verwenden willst, müsstest Du, wie bastla schon bemerkte, dafür die verzögerte Variablenerweiterung aktivieren und benutzen. Wenn Dir der Begriff nichts sagt, bitte mal danach googeln.

Gruß
Friemler
Mitglied: bastla
bastla 26.05.2011, aktualisiert am 18.10.2012 um 18:46:59 Uhr
Goto Top
Hallo Lox0805!
? Ich brauche Pfad UND Pfad mit Dateiname .
Das habe ich ja auch nicht bezweifelt - nur, dass Du dafür eigene Variablen benötigen würdest, sehe ich eigentlich nicht:
:bastla
echo Machwas mit "%~dp1"  
echo und jetzt mit "%~nx1"  
rem %access% %1 /repair
rem %access% %1 /compact
copy %1 %cziel%\
goto :eof
Zum Thema "delayedExpansion" findest Du im Forum jede Menge - nicht zuletzt auch in Friemlers Tutorial zur FOR-Schleife ...

Grüße
bastla