pegasus37
Goto Top

Wie kann man Fallstricke im ECHO-Kommando umgehen?

Ich möchte über eine Textdatei eine SQL-Abfrage übergeben. Mein bisheriger Ansatz ist
ECHO select max(pasn_auftr_nr) from ps_duepasn where pasn_nve="%%~nf">abfrage.txt  
Allerdings wird das ganze offensichtlich nicht als ganze Zeile interpretiert, sonder es erscheint die FM "from" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Wieso nicht? Eigentlich sollte eine Echo-Zeile ja bis zum Ende (abgesehen von der Ausgabeumleitung) ja insgesamt interpretiert werden, warum hier nicht?
Und vor allem: Wie kann ich das Problem umgehen?
Ein Quoten in "" hab ich schon probiert, das bringt mir anschliessend einen Fehler mit der SQL-Abfrage...

Vielen Dank für Eure Hilfe und Unterstützung.

Gruß
P37

Content-Key: 141767

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

Printed on: April 24, 2024 at 02:04 o'clock

Member: bastla
bastla Apr 29, 2010 at 14:35:06 (UTC)
Goto Top
Hallo Pegasus37!

Kann ich so nicht nachvollziehen - was steht denn in "%%f"?

Grüße
bastla
Member: Pegasus37
Pegasus37 Apr 29, 2010 at 14:41:40 (UTC)
Goto Top
In %%f steht ein Dateiname in der Form 12345678901234567890.pdf, also eine pdf-Datei mit einer 20-stellige Zahl als Dateiname. Diese Zahl wird benutzt, um eine damit verbundene andere Zahl über die SQL-Abfrage zu bekommen und anschließend die Datei umzubenennen.

Insgesamt sieht die Sache so aus:
FOR %%f IN (*.pdf) DO (
	ECHO select max(pasn_auftr_nr) from ps_duepasn where pasn_nve="%%~nf">abfrage.txt   
	MINISQL.EXE abfrage.txt antwort.txt
		set /p "sendung="<"antwort.txt"  
	REN %%f %sendung%.pdf 2>NUL
DEL %%f
)
Mitglied: 77559
77559 Apr 29, 2010 at 15:07:07 (UTC)
Goto Top
Die Klammer im Echo ist das Problem,
der CMD Interpreter ist da ein bisschen doof und denkt das die Do Klammer hier endet.
Lagere die Befehle der DO Klammer in eine Sub aus.

FOR %%f IN (*.pdf) DO call :Sub "%%~nf" "%%f"  

goto :EOF
:Sub
ECHO select max(pasn_auftr_nr) from ps_duepasn where pasn_nve='%~1'>abfrage.txt   
MINISQL.EXE abfrage.txt antwort.txt
set /p "sendung="<"antwort.txt"  
REN %2 %sendung%.pdf 2>NUL
:: der Del sollte überflüssig sein 
DEL /Q  %2  2>NUL
Goto :Eof

Gruß
LotPings

Fehler im Del verbessert
Bibers Anmerkung eingebaut
Member: Biber
Biber Apr 29, 2010 at 15:15:52 (UTC)
Goto Top
Moin Pegasus37,

wenn aber aber doch pasn_nve eine Zahl ist, dann kann doch
... WHERE pasn_nve = "%%~nf"
...gar nicht klappen. Dann muss es doch:

... WHERE pasn_nve = %%~nf
... lauten.

Und auch im String-Fall müssen EINfache statt doppelte Anführungszeichen in einem SQL-Statement verwendet werden.

Grüße
Biber
Member: bastla
bastla Apr 29, 2010 at 15:39:14 (UTC)
Goto Top
@77559
Lagere die Befehle der DO Klammer in eine Sub aus.
Sollte nicht auch ein einfaches Maskieren der Klammern reichen?

Grüße
bastla
Mitglied: 77559
77559 Apr 29, 2010 at 15:54:42 (UTC)
Goto Top
Zitat von @bastla:
Sollte nicht auch ein einfaches Maskieren der Klammern reichen?
Jein, da die Fehlermeldung sich auf "from" bezieht reicht es wahrscheinlich aus die schließende Klammer mit einem caret zu maskieren "^("
Allerdings haben wir auch in einem geklammerten Bereich eine Variablen Zuweisung die auch gleich genutzt wird, das würde delayed Expansion erfordern und insofern ist die Sub wahrscheinlich günstiger.

Gruß
LotPings
Member: bastla
bastla Apr 29, 2010 at 18:06:32 (UTC)
Goto Top
@77559
das würde delayed Expansion erfordern und insofern ist die Sub wahrscheinlich günstiger.
Sieht zwar nicht danach aus, als ob in diesem Fall mit "!" zu rechnen wäre, aber grundsätzlich hast Du Recht ...

Grüße
bastla
Member: Pegasus37
Pegasus37 Apr 29, 2010 at 19:07:29 (UTC)
Goto Top
So viele Antworten...
Im Moment kann ich die Vorschläge noch nicht ausprobieren, erst morgen wieder.

@Biber
pasn_nve ist ein Feldbezeichner in der Datenbank, die ich mit dem Minisql abfragen will. Die doppelten Anführungszeichen liefern mir in dem Tool schon das richtige Ergebnis, müssen also so stehen bleiben.

Das Del ist bei näherer Betrachtung jetzt aus der Ferne natürlich überflüssig.

Vielen Dank für die Hilfe.
Member: Pegasus37
Pegasus37 Apr 30, 2010 at 09:46:28 (UTC)
Goto Top
Wie erwartet funktioniert der Vorschlag mit der Subroutine hervorragend.
Nochmals vielen Dank an alle, die sich mit meinem Problem beschäftigt haben.
Member: pieh-ejdsch
pieh-ejdsch May 04, 2010 at 20:38:17 (UTC)
Goto Top
Hi Leute,

Mittels setzen des Strings-mit-Klammern in eine For Variable wird die Klammer beim Echo nicht interpretiert.

for /f "delims=" %%i in  ("select max(pasn_auftr_nr) from ps_duepasn where pasn_nve=") do FOR %%f IN (*.pdf) DO (  
	ECHO %%i"%%~nf">abfrage.txt   
	MINISQL.EXE abfrage.txt antwort.txt
		set /p "sendung="<"antwort.txt"  
	REN %%f %sendung%.pdf 2>NUL
)

Gruß Phil
Mitglied: 77559
77559 May 04, 2010 at 20:54:25 (UTC)
Goto Top
Hallo Phil,
das ist eine Alternative, bei dem Konstrukt kannst du /f "delims=" aber auch gleich ganz weglassen

Gruß
LotPings

PS: Dir ist schon aufgefallen das der Beitrag bereits gelöst ist ? face-wink
Member: pieh-ejdsch
pieh-ejdsch May 05, 2010 at 08:38:39 (UTC)
Goto Top
Hi LotPings,

dass der Beitrag auf gelöst gesetz war ist mir schon aufgefallen.
/f "delims=" - lass ich bei der nächsten Komplettübername der Zeichenfolge weg - danke für den Tipp.

Aber es passt ja zum Thema, wie Du schon bemerkt hast, als Alternative.

Hätte ich wohl eher ein anderes Beispiel nehmen sollen ... beim nächten mal mach ichs so

Gruß Phil