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
GELÖST

Variablen werden nicht durch Werte ersetzt

Frage Entwicklung Batch & Shell

Mitglied: Backspace

Backspace (Level 1) - Jetzt verbinden

10.11.2010 um 11:43 Uhr, 3942 Aufrufe, 16 Kommentare

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.)


01.
 
02.
@echo off 
03.
 
04.
FOR /F %%a IN ('date /t') Do echo %%a 
05.
 
06.
FOR /F "skip=3" %%b IN ('getmac') DO echo %%b 
07.
 
08.
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)" 
09.
 
10.
wget -O - "http://172.xx.x.xx/Ordner/Programm.php?MACADDRESS=${%%b}&DRIVE=${%%c}&FREESPACE=${%%n}&DATETIMES=${%%a}&save_data=true" 
11.
 
Hoffe Ihr könnt mir da weiterhelfen.


Danke

Gruß

Backspace
Mitglied: Nagus
10.11.2010 um 12:21 Uhr
Moin,

als erstes Leerzeichen weg bei date

01.
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
Bitte warten ..
Mitglied: Backspace
10.11.2010 um 12:49 Uhr
Hallo Nagus,


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



Gruß

Backspace
Bitte warten ..
Mitglied: BigWim
10.11.2010 um 12:50 Uhr
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:


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

Markus
Bitte warten ..
Mitglied: Friemler
10.11.2010 um 13:12 Uhr
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
Bitte warten ..
Mitglied: Backspace
10.11.2010 um 16:28 Uhr
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
Bitte warten ..
Mitglied: Biber
10.11.2010 um 17:17 Uhr
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
Bitte warten ..
Mitglied: bastla
10.11.2010 um 18:07 Uhr
@Biber
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
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 , 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
Bitte warten ..
Mitglied: Biber
10.11.2010 um 18:54 Uhr
[OT] @bastla

Zitat von bastla:
Wofür waren die übrigen 2 1/2 Zeilen gedacht?
Für Kommentare, als Raum für Notizen, für ein schnelles "2 Becher Joghurt und Butter mitbringen!" oder ein "Mit freundlichen Grüßen 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]
Bitte warten ..
Mitglied: bastla
10.11.2010 um 18:58 Uhr
[OT]
@Biber
"Kommentare"? Hm, müsste ich doch eigentlich schon mal gehört haben ...

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: Backspace
10.11.2010 um 22:17 Uhr
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
Bitte warten ..
Mitglied: bastla
10.11.2010 um 22:31 Uhr
Hallo Backspace!

Das sollte auch genügen:
01.
@echo off & setlocal 
02.
FOR /F "skip=3" %%b IN ('getmac') DO set "MAC=%%b" 
03.
set "Check=%temp%\Checkdiskspace.vbs" 
04.
>"%Check%" echo For Each Drive In Array("C:","D:"): WScript.Echo Drive,Int(CreateObject("Scripting.FileSystemObject").GetDrive(Drive).FreeSpace/1024/1024/1024):Next 
05.
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
Bitte warten ..
Mitglied: Backspace
11.11.2010 um 09:28 Uhr
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 ?
Bitte warten ..
Mitglied: bastla
11.11.2010 um 10:04 Uhr
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
Bitte warten ..
Mitglied: Backspace
11.11.2010 um 12:23 Uhr
Hallo bastla,


Spitze !

Vielen Dank !

Gruß

Backspace
Bitte warten ..
Mitglied: Backspace
01.12.2010 um 12:39 Uhr
Hallo,

hab da noch eine ergänzende Frage:

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

01.
>"%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
Bitte warten ..
Mitglied: Biber
01.12.2010 um 15:40 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Netzwerkmanagement
gelöst Icingaweb2 Werte für das NRPE CheckDisk anpassen (8)

Frage von M.Marz zum Thema Netzwerkmanagement ...

Administrator.de Feedback
Bug? "m f g" (ohne Leerzeichen) wird auch in URL ersetzt (4)

Frage von emeriks zum Thema Administrator.de Feedback ...

Batch & Shell
gelöst Variablen Zusammenbauen 2.0 ( Batch ) (6)

Frage von clragon zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...