backspace
Goto Top

Variablen werden nicht durch Werte ersetzt

Hallo,

folgende Batchdatei:

die Variablen "%%a, %%b, %%c, %%n" werden beim Ausführen (über PHP) leider genauso in die MySQL-Tabelle eingetragen und nicht durch die entsprechend ausgelesenen Werte ersetzt.

(Das PHP-Programm ist Fehlerfrei, getestet an einer Shelldatei mit der gleichen Funktion.)


@echo off

FOR /F %%a IN ('date /t') Do echo %%a  

FOR /F "skip=3" %%b IN ('getmac') DO echo %%b  

FOR /F "skip=19 tokens=1,2-5,9*" %%c IN ('"C:\Checkdiskspace\Psinfo -d"') DO echo (%%c %%n) | C:\Checkdiskspace\grep.exe -E "(C|D)"  

wget -O - "http://172.xx.x.xx/Ordner/Programm.php?MACADDRESS=${%%b}&DRIVE=${%%c}&FREESPACE=${%%n}&DATETIMES=${%%a}&save_data=true"  

Hoffe Ihr könnt mir da weiterhelfen.


Danke

Gruß

Backspace

Content-Key: 154750

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

Printed on: April 25, 2024 at 01:04 o'clock

Member: Nagus
Nagus Nov 10, 2010 at 11:21:50 (UTC)
Goto Top
Moin,

als erstes Leerzeichen weg bei date

FOR /F %%a IN ('date/t') Do echo %%a  
dann läuft dass script bis wget und ich muss passen

ich würde für die Fehlersuche das @echo off auskommentieren - das macht es leichter ...
Gruß
Nagus
Member: Backspace
Backspace Nov 10, 2010 at 11:49:45 (UTC)
Goto Top
Hallo Nagus,


der Befehl zum Auslesen des Datums funktioniert sowohl mit als auch ohne Leerzeichen.


Gruß

Backspace
Member: BigWim
BigWim Nov 10, 2010 at 11:50:30 (UTC)
Goto Top
Moin,

echo on ist immer ein guter Rat. Ich tippe auf die Verwendung der FOR-Schleife. Sollen mehrere Anweisungen ausgeführt werden, müssen diese in Klammern stehen. Lange Rede kurzer Sinn. Ich denke, so sollten die Variablen auch als Variablen arbeiten:


.
.
.
FOR /F "skip=19 tokens=1,2-5,9*" %%c IN ('"C:\Checkdiskspace\Psinfo -d"') DO (  
    echo (%%c %%n) | > C:\Checkdiskspace\grep.exe -E "(C|D)"  
    wget -O - "http://172.xx.x.xx/Ordner/Programm.php?MACADDRESS=${%%b}&DRIVE=${%%c}&FREESPACE=${%%n}&DATETIMES=${%%a}&save_data=true"  
)


Markus
Member: Friemler
Friemler Nov 10, 2010 at 12:12:27 (UTC)
Goto Top
Hallo Backspace,

Du hast da gleich mehrere Fehler gemacht.

  • Erste FOR-Schleife (date /t) ist korrekt.
  • Zweite FOR-Schleife (getmac) ist korrekt.
  • Dritte FOR-Schleife enthält Fehler. Du willst die Tokens 1-5, 9 und den Rest der Ausgabezeile von PsInfo verarbeiten. Du erhältst deshalb die Laufvariablen %%c-%%g (Tokens 1-5), %%h (Token 9) und %%i (der Rest der Ausgabezeile). Die Variable %%n wird nicht erzeugt.
  • Der WGET-Befehl steht außerhalb der ganzen FOR-Schleifen, die Laufvariablen %%a, %%b, %%c und %%n sind hier überhaupt nicht definiert, das sind Variablen, die nur innerhalb von FOR-Schleifen verwendet werden können. Du müsstest also die Zeichenketten, die Du in den drei FOR-Schleifen anzeigen/verarbeiten willst, zusätzlich noch in normalen Umgebungsvariablen speichern, damit Du sie in der WGET-Zeile benutzen kannst.

Warum schreibst Du eigentlich ${%%b} usw. in der WGET-Zeile?

Gruß
Friemler
Member: Backspace
Backspace Nov 10, 2010 at 15:28:11 (UTC)
Goto Top
Hallo nochmal,

danke erstmal für Eure Hilfe.

@Markus:
guter Tipp! aber je nachdem wie/wo ich die Klammern einsetze, wird leider jeweils nur einer der Werte in die MySQL-Tabelle geschrieben (immer der zuletzt ausgelesene Wert), hat wohl mit dem Gesamtaufbau der Forschleifen in meiner Batchdatei zu tun. Es fehlt wie schon Friemler wohl richtig sagt, eine Speichermöglichkeit der Werte.

@Friemler:
das mit dem %%n:
ich mußte das "tokens=1,2-5,9*" so setzen, da ich anders leider sonst nicht an die gewünschte Info kommen würde. Eine Idee, wie das besser zu gestalten wäre?


Das speichern in normale Umgebungsvariablen, meinst Du den set-Befehl? ==> set "MACADDRESS"=%%b


Sorry, bin noch absoluter Anfänger was Programmieren angeht.


Danke


Backspace
Member: Biber
Biber Nov 10, 2010 at 16:17:04 (UTC)
Goto Top
Moin Backspace,

nur ergänzend zu BigWim und Friemler noch zwei kleine Tipps von mir.

1) Mach bitte vorher einen proof-of-concept am CMD-Prompt bevor die ganzen filigranen grep/wget/undwasnochalles Zwiebelschichten herumgewickelt werden.

2) Wenn dich ein Werkzeug [neudeutsch: Tool] wie in diesem Falle "PsInfo.exe" dazu zwingt, dass du mit drei bis fünf anderen Tools nacharbeiten musst--> ja hey! Dann überleg doch mal, ob das Tool wohl für deinen Zweck optimal ist. Und nimm ggf ein anderes.

zu 1)

Wenn du psinfo im ersten Schritt halbwegs vernünftig bzw. zielgerichtet aufrufst, nämlich so:
>psinfo -d  2>nul |findstr  /C:"C: " /C:"D: "
    C: Fixed      NTFS       System XP               30.0 GB    16.0 GB    53%
    D: Fixed      NTFS       Daten                   44.5 GB    42.4 GB    95%
[auch wenn das eine oder andere davon eher undokumentiert ist]

Dann hast du
erstens) "nur noch" die Laufwerke C: und D. --> und brauchst keinen grep-Firlefanz mehr.
zweitens) kannst du jetzt in Friemlers Aussage nachvollziehen, das es gar kein Token namens %n geben wird, weil das erste Token bei dir %c heisst, nur 9 Token kommen und somit das letzte Token %k heissen könnte
drittens) siehst du, dass leider leider leider NICHT gewährleistet ist, dass in jeder Zeile die gleiche Anzahl Tokens kömmt.

Bei XP/Vi$ta-Systemen hat die Bootpartition standardmäßig einen Namen der Form "System XP", die zweite Partition heisst immer "Daten" (bzw. neudeutsch "Data")

Somit hast du in der Zeile der System-Partition "C:" ein Token mehr.

Meine Empfehlung--> der psinfo-Output ist IMHO für deine Zwecke suboptimal [normaldeutsch: Grütze].

Lass dir dreieinhalb VbScript-Zeilen zusammenschrubbeln zur gezielten Ermittlung der FREESPACE-Werte.
Oder nimm ein anderes One-Trick-Tool, das sowas kann. Eine diskuse/du-Portierung aus der Welt der Pinguine z.B.

Grüße
Biber
Member: bastla
bastla Nov 10, 2010 at 17:07:02 (UTC)
Goto Top
@Biber
Lass dir dreieinhalb VbScript-Zeilen zusammenschrubbeln zur gezielten Ermittlung der FREESPACE-Werte.
Wofür waren die übrigen 2 1/2 Zeilen gedacht? face-wink
For Each Drive In Array("C:","D:"):WScript.Echo Drive,Int(CreateObject("Scripting.FileSystemObject").GetDrive(Drive).FreeSpace/1024/1024/1024):Next
Wenn's flexibler sein soll (Laufwerksbuchstaben als Parameter):
On Error Resume Next:For Each Drive In WScript.Arguments:WScript.Echo Drive,Int(CreateObject("Scripting.FileSystemObject").GetDrive(Drive).FreeSpace/1024/1024/1024):Next
Um doch noch auf 3 Zeilen zu kommen face-wink, die Variante für alle "fixed drives":
For Each Drive In CreateObject("Scripting.FileSystemObject").Drives:If Drive.DriveType=2 Then:WScript.Echo Drive.DriveLetter,Int(Drive.FreeSpace/1024/1024/1024):End If:Next
Grüße
bastla
Member: Biber
Biber Nov 10, 2010 at 17:54:39 (UTC)
Goto Top
[OT] @bastla

Zitat von @bastla:
Wofür waren die übrigen 2 1/2 Zeilen gedacht? face-wink
Für Kommentare, als Raum für Notizen, für ein schnelles "2 Becher Joghurt und Butter mitbringen!" oder ein "MfG bastla".. face-wink

Grüße und danke
Biber

[Edit]
"Kommentare"? Hm, müsste ich doch eigentlich schon mal gehört haben ...
Aber bestimmt nicht in diesem Forum, oder? *gg
[/Edit]

[/OT]
Member: bastla
bastla Nov 10, 2010 at 17:58:36 (UTC)
Goto Top
[OT]
@Biber
"Kommentare"? Hm, müsste ich doch eigentlich schon mal gehört haben ... face-wink

Grüße
bastla
[/OT]
Member: Backspace
Backspace Nov 10, 2010 at 21:17:29 (UTC)
Goto Top
Hallo,

habt Ihr evtl. eine alternative zu den Forschleifen?

Hab mir gedacht, die einzelnen Forschleifen (Zeilen) evtl. jeweils in eine eigene Batchdatei zu schreiben, ebenso den wget-Befehl.

Krieg die obige Batchdatei (mehrere Forschleifen am Stück) so nicht gelöst.

Also insgesamt 4 kleine Batchdateien.

Schleife1: Wert aus Batchdatei 1 wird an Batchdatei 2 übergeben
Schleife2: Beide Werte aus Batchdatei 1+2 werden an Batchdatei 3 übergeben
Schleife3: Drei Werte aus Batchdatei 1+2+3 werden an Batchdatei 4 (wget-Befehl) übergeben
Batchdatei4: leitet alle Werte (über PHP) an MySQL-Datenbank


Meine Frage dazu:

hab mir gedacht, die Werte so zu übertragen (hoffe das passt so):

call C:\Ordner\Nächste_Batchdatei.bat "%Werte aus vorige Batchdateien%"

aber wie müssen die Werte nach der Weitergabe an die nächste Batchdatei gespeichert werden?


Danke

Backspace
Member: bastla
bastla Nov 10, 2010 at 21:31:48 (UTC)
Goto Top
Hallo Backspace!

Das sollte auch genügen:
@echo off & setlocal
FOR /F "skip=3" %%b IN ('getmac') DO set "MAC=%%b"  
set "Check=%temp%\Checkdiskspace.vbs"  
>"%Check%" echo For Each Drive In Array("C:","D:"): WScript.Echo Drive,Int(CreateObject("Scripting.FileSystemObject").GetDrive(Drive).FreeSpace/1024/1024/1024):Next  
FOR /F "tokens=1-2" %%c IN ('cscript //nologo "%Check%"') DO echo wget -O - "http://172.xx.x.xx/Ordner/Programm.php?MACADDRESS=${%MAC%}&DRIVE=${%%c}&FREESPACE=${%%d}&DATETIMES=${%date%}&save_data=true"  
Wegen des "echo" vor dem "wget" werden die entsprechenden Zeilen (je eine für die Partitionen C: und D: ) zum Testen einmal nur ausgegeben - wenn Du das "echo" entfernst, wird "wget" tatsächlich ausgeführt.

Grüße
bastla
Member: Backspace
Backspace Nov 11, 2010 at 08:28:08 (UTC)
Goto Top
Hallo bastla,


Suuuuuper !

Du hast meinen Tag gerettet !

Funktioniert einwandfrei !


Danke!

Gruß

Backspace


EDIT:

Nur eine Kleinigkeit: kann man auch die Prozentwerte anstatt Gigabyte-Werte ausgeben lassen ?
Member: bastla
bastla Nov 11, 2010 at 09:04:52 (UTC)
Goto Top
Hallo Backspace!
kann man auch die Prozentwerte anstatt Gigabyte-Werte ausgeben lassen ?
Ändere die Zeile 4 auf
>"%Check%" echo For Each Drive In Array("C:","D:"):Set D=CreateObject("Scripting.FileSystemObject").GetDrive(Drive):WScript.Echo Drive,Int(D.FreeSpace*100/D.TotalSize):Next 
Grüße
bastla
Member: Backspace
Backspace Nov 11, 2010 at 11:23:19 (UTC)
Goto Top
Hallo bastla,


Spitze !

Vielen Dank !

Gruß

Backspace
Member: Backspace
Backspace Dec 01, 2010 at 11:39:08 (UTC)
Goto Top
Hallo,

hab da noch eine ergänzende Frage:

der folgende Code sollte nur die Fixed-Laufwerke auslesen (also ohne USB, CD, Remote,......):

>"%Check%" echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=2 Then:WScript.Echo D.DriveLetter&":",Int(D.FreeSpace*100/D.TotalSize):End If:Next  

Das Problem ist, dass leider folgende Fehlermeldung kommt:

Kompilierungsfehler in Microsoft VBScript: 'Next' erwartet.


Wo könnte der Fehler liegen ?

Danke

Backspace
Member: Biber
Biber Dec 01, 2010 at 14:40:07 (UTC)
Goto Top
Moin Backraum,

wenn du einen Batch/CMD-Befehl zum Schreiben des VBS-Snippets verwendest, dann ist das Ampersand-Zeichen "&" ein Steuerzeichen und muss maskiert werden.
Ersetze in der Zeile alle Vorkommnisse von & [=Ampersand] durch ^& [=Carettiertes Ampersand].

Grüße
Biber