Top-Themen

Aktuelle Themen (A bis Z)

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, 4021 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 "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]
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 ..
Ähnliche Inhalte
Batch & Shell
Wenn Variable Wert X hat, dann
gelöst Frage von complexBatch & Shell6 Kommentare

Hallo zusammen! Bin aktuell an einem Script und hätte eine Frage: Im Script erhält eine Variable ab und zu ...

Batch & Shell
Variable über Wert aussuchen
gelöst Frage von CreatorXBatch & Shell2 Kommentare

Hallo, ich beschäftige mich gerade mit dem erstellen eines Windows Batchscripts. Folgendes Problem: Es gibt Verschiedene Variablen, die sind ...

Batch & Shell
Wert in einer Variable verändern
gelöst Frage von donmanolitoBatch & Shell1 Kommentar

Hallo in dieser Schleife: echo off for /D %%a in ("c:\Ordner\*") DO @( echo %%a ) bekomme ich für ...

Batch & Shell
Batch: Variable einen Wert zuweisen
gelöst Frage von veniplexBatch & Shell7 Kommentare

Hallo zusammen! Ich bin gerade am verzweifeln Ich habe in Batch 2 Variablen: Wenn ich mir von diesen den ...

Neue Wissensbeiträge
Mac OS X

MacOS wo ist die Tilde ?

Tipp von Alchimedes vor 45 MinutenMac OS X

Hallo, ich hab eine MacOS qwertz Keyboard auf US Layout umgestellt da die Sonderzeichen besser ereichbar sind. Leider fehlt ...

Datenschutz

Weitere Inforamtionen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 7 StundenDatenschutz

Im folgenden ein weiterer Bericht über die Sicherheitsprobleme von Bea. Fataler Konstruktionsfehler im besonderen elektronischen Anwaltspostfach Gruss Penny

Windows 10

Systemdienste behalten nach Win10 inplace-Upgrade nicht die ggf. modifizierte Startart bei

Tipp von DerWoWusste vor 9 StundenWindows 103 Kommentare

Stellt Euch vor, Ihr habt ein Win10 System und modifiziert dort die Startart von Systemdiensten. Zum Beispiel wollt Ihr ...

Microsoft Office

Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei

Anleitung von SarekHL vor 12 StundenMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...

Heiß diskutierte Inhalte
Netzwerke
NTFS-Berechtigung
Frage von Daoudi1973Netzwerke23 Kommentare

Hallo zusammen und frohes neues Jahr (Sorry, ich bin spät dran) Meine Frage: 1- Ich habe einen Ordner im ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...

Microsoft Office
Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei
Anleitung von SarekHLMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...

Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von fyrb38Windows 1017 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...