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.)
Hoffe Ihr könnt mir da weiterhelfen.
Danke
Gruß
Backspace
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 154750
Url: https://administrator.de/forum/variablen-werden-nicht-durch-werte-ersetzt-154750.html
Ausgedruckt am: 11.04.2025 um 19:04 Uhr
16 Kommentare
Neuester Kommentar
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:
Markus
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
Hallo Backspace,
Du hast da gleich mehrere Fehler gemacht.
Warum schreibst Du eigentlich ${%%b} usw. in der WGET-Zeile?
Gruß
Friemler
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
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:
[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
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%
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
@Biber

Wenn's flexibler sein soll (Laufwerksbuchstaben als Parameter):
Um doch noch auf 3 Zeilen zu kommen
, die Variante für alle "fixed drives":
Grüße
bastla
Lass dir dreieinhalb VbScript-Zeilen zusammenschrubbeln zur gezielten Ermittlung der FREESPACE-Werte.
Wofür waren die übrigen 2 1/2 Zeilen gedacht? For Each Drive In Array("C:","D:"):WScript.Echo Drive,Int(CreateObject("Scripting.FileSystemObject").GetDrive(Drive).FreeSpace/1024/1024/1024):Next
On Error Resume Next:For Each Drive In WScript.Arguments:WScript.Echo Drive,Int(CreateObject("Scripting.FileSystemObject").GetDrive(Drive).FreeSpace/1024/1024/1024):Next
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
bastla
[OT] @bastla
Für Kommentare, als Raum für Notizen, für ein schnelles "2 Becher Joghurt und Butter mitbringen!" oder ein "MfG bastla"..
Grüße und danke
Biber
[Edit]
[/Edit]
[/OT]
Für Kommentare, als Raum für Notizen, für ein schnelles "2 Becher Joghurt und Butter mitbringen!" oder ein "MfG bastla"..
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]
Hallo Backspace!
Das sollte auch genügen:
Wegen des "
Grüße
bastla
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"
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