Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
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.

Batch - Set Variable in einer FOR Schleife

Frage Entwicklung Batch & Shell

Mitglied: Lox0805

Lox0805 (Level 1) - Jetzt verbinden

25.05.2011, aktualisiert 18.10.2012, 3650 Aufrufe, 18 Kommentare, 1 Danke

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:
01.
@echo off 
02.
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE" 
03.
set cziel=s:\AccessDBs 
04.
 
05.
rem datei000   = Zu sichernde Datei 
06.
rem datei000p = Quellpfad der Datei 
07.
 
08.
set datei001=AccessDB1.mdb 
09.
set datei001p=C:\Verz1\...\ 
10.
 
11.
set datei002=AccessDB2.mdb 
12.
set datei002p=C:\Verz2\...\ 
13.
 
14.
set datei003=AccessDB3.mdb 
15.
set datei003p=C:\Verz3\...\ 
16.
 
17.
set datei004=AccessDB4.mdb 
18.
set datei004p=C:\Verz4\...\ 
19.
 
20.
  
21.
echo . Verarbeitung beginnt 
22.
echo --------------------------------------------------------------- 
23.
echo . 
24.
echo . 1. Sammeln und Sichern ALLER ACCESS DBs 
25.
echo =============================================================== 
26.
copy %datei001p%%datei001% %CZIEL%\ 
27.
copy %datei002p%%datei002% %CZIEL%\ 
28.
copy %datei003p%%datei003% %CZIEL%\ 
29.
copy %datei004p%%datei004% %CZIEL%\ 
30.
 
31.
echo . 2. Gesicherte Access DBs komprimieren 
32.
echo =============================================================== 
33.
 FOR %%a IN ("%CZIEL%\*.mdb") DO %ACCESS% %%a /compact  
34.
 
35.
 
36.
echo . 3. Access2007 Sicherheitswarunung unterdruecken (Prog. reg.exe) 
37.
echo =============================================================== 
38.
reg add "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security" /v VBAWarnings /t REG_DWORD /d 1 /f 
39.
 
40.
 
41.
echo . 4. Registry Pfad anlegen (Prog. AddPath1.1), damit Access Runtime arbeiten kann (Prog. BoxWech2 erledigt den OK Klick) 
42.
echo   Voraussetzung fuer Punkt 5 
43.
echo ======================================================================================================= 
44.
addpath /Path %datei001p% 
45.
addpath /Path %datei002p% 
46.
addpath /Path %datei003p% 
47.
addpath /Path %datei004p% 
48.
 
49.
 
50.
echo . 5. Access DB im Quelllaufwerk komprimieren (statt "Rueck"copy) 
51.
echo =============================================================== 
52.
%access% %datei001p%%datei001% /compact 
53.
%access% %datei002p%%datei002% /compact 
54.
%access% %datei003p%%datei003% /compact 
55.
%access% %datei004p%%datei004% /compact 
56.
 
57.
pause
Wie lässt sich das optimieren?????

Vielen Dank und Gruß.
Mitglied: bastla
25.05.2011, aktualisiert 18.10.2012
Hallo Lox0805 und willkommen im Forum!

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

Grüße
bastla
Bitte warten ..
Mitglied: Lox0805
25.05.2011 um 16:53 Uhr
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

Vielen Dank !!!


01.
@echo off 
02.
setlocal 
03.
 
04.
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE" 
05.
set cziel=s:\AccessDBs 
06.
set counter=10 
07.
 
08.
set datei_p1=C:\Verz1\...\ 
09.
set datei_1=%datei_p1%AccessDB1.mdb 
10.
 
11.
set datei_p2=C:\Verz1\...\ 
12.
set datei_2=%datei_p2%AccessDB2.mdb 
13.
 
14.
set datei_p3=C:\Verz1\...\ 
15.
set datei_3=%datei_p3%AccessDB3.mdb 
16.
 
17.
  
18.
echo . Verarbeitung beginnt 
19.
echo --------------------------------------------------------------- 
20.
echo . 
21.
echo . Sammeln und Sichern ALLER AKTIVEN ACCESS DBs 
22.
echo =============================================================== 
23.
for /l %%i in (1,1,%counter%) do ( 
24.
  for /f "tokens=1* delims==" %%j in ('set datei_%%i') do ( 
25.
    copy %%k %CZIEL%\ 
26.
27.
28.
 
29.
 
30.
echo . Gesicherte Access DBs komprimieren 
31.
echo =============================================================== 
32.
FOR %%a IN ("%CZIEL%\*.mdb") DO %ACCESS% %%a /compact  
33.
 
34.
 
35.
echo . Access2007 Sicherheitswarunung unterdruecken 
36.
echo =============================================================== 
37.
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations" /f 
38.
reg add "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security" /v VBAWarnings /t REG_DWORD /d 1 /f 
39.
 
40.
 
41.
echo . Registry Pfad anlegen, damit Access Runtime arbeiten kann 
42.
echo =============================================================== 
43.
for /l %%i in (1,1,%counter%) do ( 
44.
  for /f "tokens=1* delims==" %%j in ('set datei_p%%i') do ( 
45.
    addpath /Path %%k 
46.
47.
48.
 
49.
 
50.
echo . Access DB im Quelllaufwerk komprimieren 
51.
echo =============================================================== 
52.
for /l %%i in (1,1,%counter%) do ( 
53.
   for /f "tokens=1* delims==" %%j in ('set datei_%%i') do ( 
54.
     %access% %%k /compact 
55.
56.
57.
 
58.
pause
Bitte warten ..
Mitglied: 60730
26.05.2011 um 02:26 Uhr
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
Bitte warten ..
Mitglied: Lox0805
26.05.2011 um 12:42 Uhr
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?

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:
01.
for %%F in (C:\Verz1\..\AccessDB1.mdb) do set groesse_a=%%~zF 
02.
for %%F in (S:\Verz1\..\AccessDB1.mdb) do set groesse_b=%%~zF 
03.
 
04.
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.
01.
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

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

Aber erstmal Danke für Deinen Beitrag...
Bitte warten ..
Mitglied: 60730
26.05.2011 um 13:02 Uhr
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
01.
:parameter 
02.
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"  
03.
set "cred= /user username /pwd password" 
04.
set cziel=s:\AccessDBs 
05.
 
06.
:schleife 
07.
rem in die Klammern die DBs reinmalen 
08.
for %%a in (C:\Verz1\.1.mdb\;C:\Verz2\2.mdb;C:\Verz3\3.mdb) do call :bastla  %~dpna 
09.
 
10.
goto eof 
11.
 
12.
:bastla 
13.
echo . Sammeln und Sichern ALLER AKTIVEN ACCESS DBs - die teoretisch nicht offen sind. 
14.
if exist %1.ldb echo Datei %1 offen>>errorlog.txt 
15.
if not exist %1.ldb ( 
16.
                            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. 
17.
 
18.
                             %access% %1.mdb %cred% /repair 
19.
                             %access% %1.mdb %cred% /compact 
20.
                             copy %1 %cziel%\ 
21.
22.
eof

Gruß
Bitte warten ..
Mitglied: Lox0805
26.05.2011 um 14:30 Uhr
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?
Bitte warten ..
Mitglied: 60730
26.05.2011 um 14:49 Uhr
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...
01.
for %%a in ( 
02.
	c:\script\ 
03.
	%windir% 
04.
	c:\ 
05.
) do echo %%a 
06.
 
07.
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ß
Bitte warten ..
Mitglied: Lox0805
26.05.2011 um 15:58 Uhr
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.


01.
@echo off 
02.
 
03.
:parameter 
04.
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"  
05.
set cziel=s:\AccessDBs 
06.
 
07.
:schleife 
08.
 
09.
for %%a in ( 
10.
 
11.
     c:\Verz1\Access_DB1.mdb 
12.
     c:\Verz2\Access_DB2.mdb 
13.
 
14.
) do call :bastla  %~dpna 
15.
 
16.
 
17.
goto eof 
18.
 
19.
:bastla 
20.
if exist %1.ldb echo Datei %1 offen >>%cziel%\errorlog.txt 
21.
if not exist %1.ldb ( 
22.
                             
23.
			for %%i in ("%1") do set sPATH=%%~di%%~pi 
24.
			for %%i in ("%1") do set sFILE=%%~ni%%~xi 
25.
 
26.
			set Path=%sPath:"=% 
27.
			set File=%sFile:"=% 
28.
 
29.
                        rem %access% %1.mdb /repair 
30.
                        rem %access% %1.mdb /compact 
31.
                        rem copy %1 %cziel%\ 
32.
 
33.
			copy %Path%\%File %cziel%\ 
34.
35.
 
36.
eof 
37.
pause

Was sagst Du dazu????

Gruß
Bitte warten ..
Mitglied: 60730
26.05.2011 um 16:13 Uhr
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.


01.
rem ungetstete Script immer ohne @echo off 
02.
 
03.
:parameter 
04.
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"  
05.
set cziel=s:\AccessDBs 
06.
 
07.
:schleife 
08.
 
09.
for %%a in ( 
10.
 
11.
     c:\Verz1\Access_DB1.mdb 
12.
     c:\Verz2\Access_DB2.mdb 
13.
 
14.
) do call :bastla  %~dpna %~dpa %~nxa  
15.
 
16.
 
17.
goto eof 
18.
 
19.
:bastla 
20.
if exist %1.ldb echo Datei %1 offen >>%cziel%\errorlog.txt 
21.
if not exist %1.ldb ( 
22.
                           
23.
 
24.
			set sPATH=%2 
25.
			set sFILE=%3 
26.
			set Path=%sPath:"=% 
27.
			set File=%sFile:"=% 
28.
 
29.
                       echo %access% %1.mdb /repair 
30.
                       echo %access% %1.mdb /compact 
31.
                       echo copy %1 %cziel%\ 
32.
   		       copy %Path%\%File% %cziel%\ 
33.
34.
 
35.
eof 
36.
pause 
37.
> 

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
@ TO:
Der einzige Punkt, wo du %Path%\%File% benutzt ist doch copy %Path%\%File% %cziel%\
Das ist doch bereits %1
Bitte warten ..
Mitglied: Friemler
26.05.2011 um 16:14 Uhr
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
Bitte warten ..
Mitglied: bastla
26.05.2011 um 16:24 Uhr
@T-Mo & Friemler: Amen.
Da im Unterprogramm ja (derzeit) de facto nur eine Aktion erfolgt, wenn keine ".ldb" existiert, würde ich das eher so anlegen
01.
@echo on & setlocal 
02.
 
03.
:parameter 
04.
set access="c:\Programme\Microsoft Office\Office12\MSACCESS.EXE"  
05.
set cziel=s:\AccessDBs 
06.
 
07.
for %%a in ( 
08.
 
09.
     c:\Verz1\Access_DB1.mdb 
10.
     c:\Verz2\Access_DB2.mdb 
11.
 
12.
) do if exist "%%~dpna.ldb" ( 
13.
    echo Datei %%a offen >>%cziel%\errorlog.txt 
14.
) else ( 
15.
    call :bastla  "%%a" 
16.
17.
pause 
18.
goto :eof 
19.
 
20.
:bastla 
21.
rem %access% %1 /repair 
22.
rem %access% %1 /compact 
23.
copy %1 %cziel%\ 
24.
goto :eof
oder ganz auf das (@T-Mo: originell benannte ) Unterprogramm verzichten ...

Grüße
bastla
Bitte warten ..
Mitglied: Lox0805
26.05.2011 um 16:27 Uhr
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
Bitte warten ..
Mitglied: bastla
26.05.2011 um 16:29 Uhr
@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
Bitte warten ..
Mitglied: Lox0805
26.05.2011 um 16:31 Uhr
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
Bitte warten ..
Mitglied: Lox0805
26.05.2011 um 16:43 Uhr
> 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:
01.
copy %Path%\%File% %cziel%\
wird \cziel\* ausgegeben:
Fehler Das Sytem kann den angegebenen Pfad nicht finden.
Bitte warten ..
Mitglied: Lox0805
26.05.2011 um 16:49 Uhr
@Lox0805
> ist ungültig: %~dpna
Ist ja auch ein Batch - daher: %%~dpna

Ja, daran lag es wohl

> 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ß
Bitte warten ..
Mitglied: Friemler
26.05.2011 um 16:58 Uhr
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
Bitte warten ..
Mitglied: bastla
26.05.2011, aktualisiert 18.10.2012
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:
01.
:bastla 
02.
echo Machwas mit "%~dp1" 
03.
echo und jetzt mit "%~nx1" 
04.
rem %access% %1 /repair 
05.
rem %access% %1 /compact 
06.
copy %1 %cziel%\ 
07.
goto :eof
Zum Thema "delayedExpansion" findest Du im Forum jede Menge - nicht zuletzt auch in Friemlers Tutorial zur FOR-Schleife ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch: SET geht nicht?! (3)

Frage von SlainteMhath zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch set p ? (3)

Frage von dax4fun zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...