the-warlord
Goto Top

freien Festplattenspeicher über die Kommandozeile abfragen

Möchte freien Speicherplatz mehrer Server im Netzwerk abfragen und in einer Datei ablegen

Ich hab folgendes Problem, ich möchte den freien Speicherplatz (Festplatte) via Kommandozeile ermitteln. Die Informationen sollen von mehreren Servern abgefragt und in eine Textdatei zusammengefasst werden.

Als Mittel würde ich am liebsten die standartmäßige Kommandozeile nutzen evtl. auch noch den WSH (Windows Scripting Host).

Nach dem ich mich aus den Lösungsvorschlägen für den Shell weg entschieden hatte und mir Biber sehr viel geholfen hat, kamm ich nun endlich zu einem brauchbaren Zwischenergebnis. Meine beiden variablen werden ausgegeben.

@echo off
@for %%a in (c: ) do @for /f "tokens=3" %%i in ('dir /-c %%a^|find /i "Bytes fre"') do (set fs_drive=%%a) & (set fs_space=%%i)
echo Laufwerk %fs_drive%\ %fs_space% Bytes Frei

Jetzt müsste nur noch die umrechnung in Megabyte erfolgen. Ich ab probiert den befehl "SET" mit der Option "/a" zu nutzen um den Wert hinter dem Gleichheitszeichen mit arithmetischen Operatoren zu verrechnen (durch 1024).

bei mir kamm immer folgender Fehler:

H:\Skripte>(set fs_drive=c: ) & (set /A fs_space="78326009856 / 1024" )
Ungültige Zahl. Zahlen sind begrenzt auf eine Genauigkeit von 32 Bits.

H:\Skripte>echo Laufwerk c:\ 78326009856 / 1024 Bytes Frei
Laufwerk c:\ 78326009856 / 1024 Bytes Frei

Liegt es an der Definition der Variable? oder hab ich einfach einen Syntax Fehler oder ähnliches Gemacht?

Für Hilfe wäre ich weiterhin sehr dankbar

Content-Key: 29650

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

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

Mitglied: 27119
27119 Apr 04, 2006 at 06:24:46 (UTC)
Goto Top
diskpart

http://support.microsoft.com/default.aspx?scid=http%3A%2F%2Fwww.microso ...

Der Befehl detail disk liefert ausführliche Informationen zu dem Datenträger, der momentan den Fokus hat.

Beispiel: Diskpart> select disk 3

Datenträger 3 ist der derzeit gewählte Datenträger.

Diskpart> detail disk

Maxtor 90432D2
Datenträgerkennung: F549D151
Typ : IDE
Bus : 0
Ziel : 0
LUN ID : 0

Volume ### Bst Bezeichnung Ds Typ Größe Status Info
---------- --- ----------- ----- ---------------- ------- --------- --------
Volume 0 F My RAID Set NTFS RAID-5 4096 MB OK
Volume 1 G FATSTRIPE FAT32 Stripe 6144 MB OK
Volume 2 H My Mirror NTFS Spiegel 2048 MB OK
Volume 3 I My Span NTFS Übergreifend 9 GB OK
Member: poortramp
poortramp Apr 04, 2006 at 06:48:10 (UTC)
Goto Top
Hi,

wenn du entfernte Rechner abfragen willst, empfehl ich dir das über SNMP zu machen.
Hier
http://www.snmp-informant.com/
findest du ein Tool dafür das auch einen Client für die Kommandozeile enthält soweit ich weiss.

Vielleicht schaust du auch mal hier
http://people.ee.ethz.ch/~oetiker/webtools/mrtg/ .
Damit kannst du die Festplattennutzung grafisch darstellen

poortramp
Member: The-Warlord
The-Warlord Apr 04, 2006 at 08:01:17 (UTC)
Goto Top
Zu SNMP-Informant, das Tool lässt sich leider nicht über die Kommandozeiel nutzen und ist somit recht uninteressant, aber trotzdem Danke für den Hinweis.
Member: Biber
Biber Apr 04, 2006 at 08:08:45 (UTC)
Goto Top
Moin, The-Warlord,
such mal in "Batch & Shell" nach "Festplattenplatz" ... da sollten schon ein paar Varianten da sein.

Sinngemäß so vom CMD-Prompt aus, wenn V:, W:, X:, Z: die anzuzeigenden Netzlaufwerke sind:

@for %a in ( V W X Z) do @for /f "tokens=3" %i in ('dir %a^:^|find /i "Bytes fre"') do @echo Lw %a: %i Bytes Frei

Als Batch jeweils statt %a und %i dann %%a und %%i

Hope That Helps
Biber
Member: problemsolver
problemsolver Apr 04, 2006 at 08:17:31 (UTC)
Goto Top
Hallo!

Nimm "psTools" von Sysinternals... http://www.sysinternals.com
Da ist ein Tool namens psinfo dabei... reicht vollkommen aus und ist darüberhinaus auch noch in der Lage über das Netzwerk andere Rechner zu überprüfen... und das beste ist.. .es ist einfach schön klein.

Gruß

Markus
Mitglied: 27119
27119 Apr 04, 2006 at 08:19:14 (UTC)
Goto Top
Muhaha - wird ja immer skuriller, der Tipps-und Tricks-Hagelschauer.

Was stimmt mit diskpart nicht? Ist doch genau das worum es hier geht...
Member: The-Warlord
The-Warlord Apr 04, 2006 at 08:22:03 (UTC)
Goto Top
Diskpart... cooles Tool kannte ich garnicht. leider kann es einem nur den Freien Speicherplatz ausgeben der noch auf der Festplatte ist (Um z.B.: eine weitere Partition anzulegen).
Eigentlich suche ich aber nach einer Möglichkeit mir die Gesamtgrösse einer Partition anzeigen zu lassen sowie den verbrauchten Speicherplatz. Ähnlich wie "df -k" unter Linux.
Der Befehl "DIR" würde mir diese inforamtionen zurückliefern, aber es gibt (Zumindestens nach meinem Wissensstand) keiner möglichkeiten die ausgabe von "DIR" zu bearbeiten. Unter Linux würde ich mit die Ausgabe von "DIR" nach "TAIL" pipen, und mir somit nur die letzte Zeile anzeigen lassen. Den rest könnte ich mir mit dem "CUT" Befehl schon zurechschnibbeln.
Ich suche nun nach einer Möglichkeit das selbe unter Windows zu realisieren.
Wäre es möglich die oben genannte Methode über den Windows Scripting Host (WSH) umzusetzen???
Member: Biber
Biber Apr 04, 2006 at 08:31:32 (UTC)
Goto Top
Unter Linux würde ich mit die Ausgabe von "DIR" nach "TAIL" pipen...

Jepp, siehe oben.
Member: The-Warlord
The-Warlord Apr 04, 2006 at 09:01:36 (UTC)
Goto Top
Hey Biber das is ja Super (verschachtelte for Schleife)
habs ein wenig geändert, gab vorher Ausgabe weil der Laufwerksbuchstabe nicht übernommen wurde (Irgendein Problem mit dem Doppelpunkt)

@for %a in (c: hface-smile do @for /f "tokens=3" %i in ('dir %a^|find /i "Bytes free"') do @echo %a %i
c: 78.327.717.888
h: 120.596.680.704

ich beschäftige mich jetzt mal mit dem konvertieren des Ergebnisses in Megabyte

Vielen Dank
Member: Biber
Biber Apr 04, 2006 at 09:17:33 (UTC)
Goto Top
Noch ein Tipp:

Wenn Du mit Bytes rechnen willst, füge noch den Parameter "/-c" an den DIR-Befehl an.

Dann ist die Ausgabe statt

ALT:
h: 120.596.680.704

NEU:
h: 120596680704

Lässt sich besser mit Rechnen.

Das mit dem ":" war ein Tippfehler...

Gruß Biber
Member: Xaero1982
Xaero1982 Apr 04, 2006 at 10:39:46 (UTC)
Goto Top
hier das ganze mal mit WMI und WSH :o)
speichern als *.vbs
On Error Resume Next
Pfad = "c:\hdd.txt"  
set fso = CreateObject("Scripting.FileSystemObject")  

Const CONVERSION_FACTOR = 1048576

Const WbemAuthenticationLevelPktPrivacy = 6

strUser = InputBox("Please enter the user name: ")  
strPassword = InputBox ("Please enter the Passwort: ")  
strNamespace = "root\cimv2"  

'Wiederholt so lange Host erreichbar ist bzw nicht unbekannter host als Meldung erscheint!  
do
    strComputer = InputBox ("Please enter the name of the computer you want to connect to: ")  

    If strComputer = "" Then  
    do
        strComputer = InputBox("Please enter correct Computername: ")  

    loop until strComputer <> "" OR strComputer = False  
    End If

    'Erreichbarkeit des PC's testen - Ping==================  

    Set objShell = CreateObject("WScript.Shell")  
    strCommand = "%comspec% /c ping -n 3 -w 1000 " & strComputer & "" 'Ping ausführen  
    Set objExecObject = objShell.Exec(strCommand)
	'=======================================================  
    Do While Not objExecObject.StdOut.AtEndOfStream
        strText = objExecObject.StdOut.ReadAll()
            If Instr(strText, "Anforderung") > 0 Then  
               objshell.popup "Host " & strComputer & " nicht erreichbar!",3  
            elseif Instr(strText, "Unbekannter Host " & strComputer & ".") <> 0  then  
               objshell.popup "Host " & strComputer & " nicht erreichbar!",3  
            end if
    loop
loop while  Instr(strText, "Unbekannter Host " & strComputer & ".")<>0 OR Instr(strText, "Anforderung") > 0  
'=======================================================  

'Verbindung zum WMI Namespace herstellen================  
    Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")  
    Set objWMIService = objwbemLocator.ConnectServer (strComputer, strNamespace, strUser, strPassword)
    objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
'=======================================================  

   Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk")  

   For Each objItem In colItems
      Message = Message & ("Name: " & objItem.Name) &vbcrlf  
      Message = Message & ("FreeSpace: " & objItem.FreeSpace / CONVERSION_FACTOR & " MB") &vbcrlf  
      Message = Message & ("Size: " & objItem.Size / CONVERSION_FACTOR & " MB") &vbcrlf  
   Next

    set fsoFile = fso.CreateTextFile(Pfad, true)

    'Schreibt den Inhalt der Variablen in () in die Textdatei  
    fsoFile.WriteLine(Message)
    'TextDatei schliessen und Objekte terminieren===========  
    fsoFile.close
    set fsoFile = nothing
    set fso = nothing

Du gibst am start den adminlogin ein und den rechner von dem du es auslesen willst.

hier:
For Each objItem In colItems
Message = Message & ("Name: " & objItem.Name) &vbcrlf
Message = Message & ("FreeSpace: " & objItem.FreeSpace / CONVERSION_FACTOR & " MB") &vbcrlf
Message = Message & ("Size: " & objItem.Size / CONVERSION_FACTOR & " MB") &vbcrlf
Next

sind die Dinge die ausgegeben werden
Du willst nur z.b. von C: haben?
Dann änder diese Zeile:
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk")
in
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE name='C:'")

Bei weiteren Problemen einfach fragen!

*editiert und einen Fehler behoben*
Member: The-Warlord
The-Warlord Apr 04, 2006 at 10:54:27 (UTC)
Goto Top
bei der Variante (die ich kaum zu Überblicken vermag) habe ich einen Fehler in Zeile 48

ich denke ich habe mich auch für die Shell Variante von Biber entschieden, mit dieser kann ich aufgrund meine leichten BASH kenntnisse am besten ausseinandersetzten.

Trotzdem vielen vielen Dank
Member: The-Warlord
The-Warlord Apr 04, 2006 at 11:09:37 (UTC)
Goto Top
Der folgende String soll jetzt als Basis für mein Skript dienen:

@for %a in (c: ) do @for /f "tokens=3" %i in ('dir /-c %a^|find /i "Bytes fre"') do

gerne hinter dem "do" das Ergebnis des Strings in eine Variable umleiten.
etwa so:

@for %a in (c: ) do @for /f "tokens=3" %i in ('dir /-c %a^|find /i "Bytes fre"') do set fs_drive=%a

um mit den variablen dann rechnen zu können

mein erstes Problem is ich möchte gerne im "do" mehrere Variablen definieren, in meinem Fall "fs_drive" für den Laufwerksbuchstaben "%a" und "fs_space" für den freien Speicherplatz. ich habe im "do" versucht die Befehle mit ",", ";", "AND" zu trennen aber hatte keinen Erfolg. alles was hinter dem "set=" Befehl Stand wurde in die Variable integriert;-(
Member: Biber
Biber Apr 04, 2006 at 11:16:35 (UTC)
Goto Top
do (set fs_drive%a=%a) & set fs_free=%i
Member: The-Warlord
The-Warlord Apr 04, 2006 at 11:48:46 (UTC)
Goto Top
Ich hab den String in eine Batch-Datei gepackt

REM @echo off
@for %%a in (c: ) do @for /f "tokens=3" %%i in ('dir /-c %%a^|find /i "Bytes fre"') do (set fs_drive=%%a) & (set /A fs_space=" %%i / 1024")
echo Laufwerk %fs_drive%\ %fs_space% Bytes Frei

Mit dem Ergebnis...

H:\Skripte>REM @echo off

H:\Skripte>(set fs_drive=c: ) & (set /A fs_space="78326009856 / 1024" )
Ungültige Zahl. Zahlen sind begrenzt auf eine Genauigkeit von 32 Bits.

H:\Skripte>echo Laufwerk c:\ 78326009856 / 1024 Bytes Frei
Laufwerk c:\ 78326009856 / 1024 Bytes Frei
Member: Xaero1982
Xaero1982 Apr 04, 2006 at 12:24:13 (UTC)
Goto Top
Welches OS hast du denn im Betrieb?

Was für ein Fehler kommt?

ah ok, der hat ein "_" verschluckt

Am ende von zeile mach ein " _" ohne anführungsstriche.
Damit bewirkst du, dass der diese Zeile in der nächsten forgesetzt wird:
Function GetWMIServices()
Set GetWMIServices = GetObject("winmgmts:" UNTERSTRICH  
& "{impersonationLevel=impersonate}!\\" & strComputer & strNamespace)  
End Function
Alternativ

Function GetWMIServices()
Set GetWMIServices = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & strNamespace)  
End Function
Edit: Ok, dass Forum verschluckt die "_" .... ersetz UNTERSTRICH durch nen "_"

*Dieser ganze Beitrag hat sich im folge der oberen Änderung erledigt ->IRRELEVANT und Fehlerhaft*
Member: The-Warlord
The-Warlord Apr 04, 2006 at 13:25:33 (UTC)
Goto Top
Ich habs soweit geändert... Jetzt kommt Abfrage für Benutzername, Passwort und Rechner dann kommt die Kommandozeile. man sieht nicht was passiert, danach fällt die Kommandozeile wieder zusammen und... ich kann nicht sagen ob was passiert ist.

Es wäre Super wenn du mal nach meinem Syntax problem im hauptthread schauen würdest... sollte ja bei den Kenntnissen kein Ding seinface-wink
Member: Xaero1982
Xaero1982 Apr 04, 2006 at 14:49:41 (UTC)
Goto Top
Da ist kein Problem face-smile

schau mal auf c:\hdd.txt

Alternativ:

'Schreibt den Inhalt der Variablen in () in die Textdatei

Wscript.echo Message '<-Das noch davor schreiben
fsoFile.WriteLine(Message) '<-schreibt Message in die hdd.txt
Member: Biber
Biber Apr 04, 2006 at 16:11:10 (UTC)
Goto Top
Na,
ich geb ja zu, dass ich es nicht mit einem Oneliner hinbekomme, wenn es in Giga- oder TeraByte dargestellt werden soll, aber eine halbe Seite VB-Skript scheint mir doch übertrieben für die banale Frage.

Hier noch mal ein Quickie als Batch:
::------snipp getfreespace.bat
@echo off & setlocal enabledelayedexpansion
@for %%a in (%*) do @for /f "tokens=3" %%i in ('dir /-c %%a:^|find /i "Bytes fre"') do call :calc %%a %%i  
goto disp
:calc 
(Set "Dim=GigaByte") & (set fs_drive%1=%1) & set fs_space=%2  
set /a fs_space=%fs_space:~0,-9%+0
if %fs_space% == 0 (set /a fs_space=%2/1024) && set "Dim=KByte"  
if [%Dim%]==[KByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=MByte"  
if [%Dim%]==[GigaByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=TeraByte"   
if [%Dim%]==[GigaByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=PetaByte"   
set "fs_space%1=%fs_space% %dim% frei"  
goto :eof

:disp
For %%i in (%*) do echo Laufwerk !fs_drive%%i!:\ !fs_space%%i!
::------snapp getfreespace.bat
Aufruf mit ein paar Laufwerken:
$cmd$>f:\getfreespace.bat c e d f y
Laufwerk c:\ 9 GigaByte frei
Laufwerk e:\ 736 KByte frei
Laufwerk d:\ 59 GigaByte frei
Laufwerk f:\ 302 MByte frei
Laufwerk y:\ 23 GigaByte frei

Der CMD-Interpreter kann nur "rechnen" mit Zahlen knapp über 2 GigaByte (2^^32).
(siehe "Bugs im CMD-Interpreter", Biber 2006, Seite 489ff)
Aber deswegen braucht man/frau doch nicht gleich aufs Bätchen zu verzichten.. face-wink

Grüße
Biber
Member: Xaero1982
Xaero1982 Apr 04, 2006 at 16:31:42 (UTC)
Goto Top
Nun gut, vorteil bei mir ist:

ich kann das von jedem beliebigen rechner aus tun und von jedem abfragen auf den ich admin rechte habe :o)

Für mich ein sehr wichtiger Punkt, da ich im moment an einem sehr umfangreichen Netzwerktool arbeite auf Basis von WMI, Vbscript und MySQL.

Desweiteren habe ich deswegen auch eine überprüfung drin ob der PC vorhanden ist und an ist ... wenn ich kürze hab ich auch nicht viel mehr *g
Member: Biber
Biber Apr 04, 2006 at 16:54:28 (UTC)
Goto Top
face-big-smile
@Xaero1982
Ich wollte auch nicht für die native Batchprogrammierung werben... habe auch keine Berührungsängste mit VBSkript mehr.

Es erschien mir nur für den Krams zu aufwändig... natürlich funktioniert es auch mit Deinem Schnipsel.

Und -um noch einen einen letzten Gag loszuwerden, meine Prüfung, ob Laufwerk vorhanden oder nicht, die reiche ich noch nach:
::------snipp getfreespaceMitLaufwerksprüfung.bat
@echo off & setlocal enabledelayedexpansion
@for %%a in (%*) do @for /f "tokens=3" %%i in ('dir /-c %%a: ^2^>nul^|find /i "Bytes fre"') do call :calc %%a %%i  
goto disp
:calc 
(Set "Dim=GigaByte") & (set fs_drive%1=%1) & set fs_space=%2  
set /a fs_space=%fs_space:~0,-9%+0
if %fs_space% == 0 (set /a fs_space=%2/1024) && set "Dim=KByte"  
if [%Dim%]==[KByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=MByte"  
if [%Dim%]==[GigaByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=TeraByte"   
if [%Dim%]==[GigaByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=PetaByte"   
set "fs_space%1=%fs_space% %dim% frei"  
goto :eof

:disp
For %%i in (%*) do if exist %%i: echo Laufwerk !fs_drive%%i!:\ !fs_space%%i!
::------snapp getfreespaceMitLaufwerksprüfung.bat

Just kidding... *gg

Biber

P.S.
@27119
Kann die Diskpart.exe denn auch andere Laufwerke als die des eigenen Rechners?
Ich dachte, das M$-Beispiel bezieht sich auf einen Server mit 6 Logischen Laufwerks-Buchstaben??
Member: Xaero1982
Xaero1982 Apr 04, 2006 at 18:29:28 (UTC)
Goto Top
Natürlich gehts auch viel kürzer face-smile

On Error Resume Next
Pfad = "c:\hdd.txt"  
set fso = CreateObject("Scripting.FileSystemObject")  

Const CONVERSION_FACTOR = 1048576
Const WbemAuthenticationLevelPktPrivacy = 6

strUser = InputBox("Please enter the user name: ")  
strPassword = InputBox ("Please enter the Passwort: ")  
strComputer = InputBox ("Please enter the Computername: ")  
strNamespace = "root\cimv2"  

'Verbindung zum WMI Namespace herstellen================  
    Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")  
    Set objWMIService = objwbemLocator.ConnectServer (strComputer, strNamespace, strUser, strPassword)
    objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
'=======================================================  
   Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk")  

   For Each objItem In colItems
      Message = Message & ("Name: " & objItem.Name) &vbcrlf  
      Message = Message & ("FreeSpace: " & objItem.FreeSpace / CONVERSION_FACTOR & " MB") &vbcrlf  
      Message = Message & ("Size: " & objItem.Size / CONVERSION_FACTOR & " MB") &vbcrlf  
   Next
    set fsoFile = fso.CreateTextFile(Pfad, true)
    fsoFile.WriteLine(Message)
    fsoFile.close
    set fsoFile = nothing
    set fso = nothing

Wobei der Großteil hier wieder nur für den Connect auf anderen Maschinen drauf geht. Solls nur für den localen sein geht wieder jede Menge weg face-smile

*Editiert und Fehler behoben*
Member: Biber
Biber Apr 04, 2006 at 18:37:01 (UTC)
Goto Top
*gggg @Xaero1982
...ich sehe schon, wir kommen ins Geschäft...

Ich könnte aus meinem Batch auch noch ein paar Zeilen eindampfen.

Aber ich denke, wir habe nun beide gezeigt, dass man auch mit Bordmitteln und MacGywer-Methoden unter Windows zu Ergebnissen kommen kann.

Weiterhin vergnüglichen Abend
Biber
Member: Xaero1982
Xaero1982 Apr 04, 2006 at 18:42:35 (UTC)
Goto Top
face-smile))
hehe joa batch vs wsh

mal was anderes *g

wünsch ich dir auch
Member: The-Warlord
The-Warlord Apr 05, 2006 at 09:58:16 (UTC)
Goto Top
Super das mit der Überprüfung ob das Laufwerk vorhanden ist oder nichtface-wink)

Also ich versuch das dann mal einzubinden (Letztendlich muss er mir ja den Netzlaufwerkpfad anzeigen, und nicht den Lokalen Laufwerksbuchstaben, sonst weiss man nicht genau wo sich der freie Speicherplatz befindet)

Weiterhin sollen die abzufragenden Netzlaufwerke in einer Datei stehen die zeilenweise ausgelesen wird.

Nur soviel zu meinen Plänen.

Ich bedanke mich recht herzlich für die Hilfestellungen und Problemlösungen die mir maßgeblich von Biber & Xaero1982 zu Verfügung gestellt worden sind.

DANKE!

MfG Simeon Steffen
Member: Xaero1982
Xaero1982 Apr 05, 2006 at 10:39:10 (UTC)
Goto Top
Und nun ? wie weiter?
Wo brauchste Hilfe ? face-smile

Kannst ja dann die Textdatei auslesen in der alles steht.

Netzlaufwerke werden bei mir zumindest auch mit angezeigt face-smile
Member: Biber
Biber Apr 05, 2006 at 10:55:47 (UTC)
Goto Top
Jo, halt ich auch für lösbar...

Wenn die Textdatei einen Laufwerksbuchstaben je Zeile hätte, dann halt auslesen mit
FOR /F.. IN..(textdatei.txt) DO ....
anstelle der jetzigen FOR ..IN..( F G H I J) DO..-Schleife.

Wenn die nur aus aus einer Zeile besteht ( U V W X X Z), dann diese Zeile in eine Variable einlesen mit:
Set /P Alldisks=<textdatei.txt

Soweit zum Thema Batch.

Grüße Biber
Member: The-Warlord
The-Warlord Apr 05, 2006 at 10:58:40 (UTC)
Goto Top
Xaero1982 ich hab dein Skript mal geprüft (das kürzere)

Skript:
On Error Resume Next
Pfad = "H:\hdd.txt"
set fso = CreateObject("Scripting.FileSystemObject")

Const CONVERSION_FACTOR = 1048576
Const WbemAuthenticationLevelPktPrivacy = 6

strUser = InputBox("Please enter the user name: ")
strPassword = InputBox ("Please enter the Passwort: ")
strComputer = InputBox ("Please enter the Computername: ")
strNamespace = "root\cimv2"

'Verbindung zum WMI Namespace herstellen================
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer (strComputer, strNamespace, strUser, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
'=======================================================
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk")

For Each objItem In colItems
Message = Message & ("Name: " & objItem.Name) &vbcrlf
Message = Message & ("FreeSpace: " & objItem.FreeSpace / CONVERSION_FACTOR & " MB") &vbcrlf
Message = Message & ("Size: " & objItem.Size / CONVERSION_FACTOR & " MB") &vbcrlf
Next
set fsoFile = fso.CreateTextFile(Pfad, true)
fsoFile.WriteLine(Message)
fsoFile.close
set fsoFile = nothing
set fso = nothing
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE name='C:'")

Die Textdatei h:\hdd.txt ist leer

Hab ich schon wieder was falsch gemacht???
Member: Xaero1982
Xaero1982 Apr 05, 2006 at 11:48:22 (UTC)
Goto Top
Naja also die letzten beiden Zeilen kannst du löschen....

Was gibst du denn bei den Eingaben ein?

Setz mal vor das
fsoFile.WriteLine(Message)
noch ein
MSGBOX Message

Damit bekommst du noch eine Messagebox mit der Ausgabe .. wenn die Leer ist stimmt was nicht.
Welches OS benutzt du?
Member: The-Warlord
The-Warlord Apr 05, 2006 at 11:52:07 (UTC)
Goto Top
Gibt es eine möglichkeit die Schleife über mehre reihen zu erweitern (strukturieren)

set lwchar=x

@for /F %%a IN (netzlaufwerke.dat) DO (net use %lwchar%^: %%a)

sonst müsste ich den gesamten inhalt meiner Schleife in eine Zeile schreiben

Beispielsweise wie unter linux (strukturierbar)

if a <> b then
commando
commando
commando
fi

Ich hoffe euch stören so noob fragen nicht, ich hab hier auch bücher da steht sowas aber net drinnen;-(
Member: Xaero1982
Xaero1982 Apr 05, 2006 at 12:04:55 (UTC)
Goto Top
Sorry, keine ahnung mit batchnoob ...

wie siehts mit meinem Script aus? Und meine Fragen ?
Member: The-Warlord
The-Warlord Apr 05, 2006 at 12:10:35 (UTC)
Goto Top
Skript:
set zcount=0
@for /F %%a IN (netzlaufwerke.dat) DO (set /a zcount=%zcount% + 1)

echo %zcount%

Ergebnis:
H:\Skripte>set zcount=0
H:\Skripte>set /a zcount=0 + 1
H:\Skripte>set /a zcount=0 + 1
H:\Skripte>set /a zcount=0 + 1
H:\Skripte>echo 1

Warum verändert er in der Schleife die variable nicht sondern übernimmt sie unverändert;-(

Ich scheine völlig untalentiert;-(( *grml*
Member: Biber
Biber Apr 05, 2006 at 12:11:33 (UTC)
Goto Top
Moin The-Warlord,

so unähnlich ist es unterm CMD der Linux-Shell nicht.
Statt

if a <> b then
commando
commando
commando
fi

dann im CMD-Batch:
if a NEQ b (
commando
commando
commando
)

nur mit dem Unterschied, dass neue Zeilen vor allen Dingen anfangen dürfen nach einer KlammerAuf nach IF [%var%] == [wert] .. (oder LSS, GTR, NEQ, GEQ... etc als Vergleichsoperator)
-oder-
KlammerAuf nach einer FOR..IN..(..) DO - Anweisung.

Also:

If [%date%]==[01.01.2007] (
echo Frohes neues Jahr!
echo Und Guten Rutsch!
)

-oder-
FOR ..... in (bla bla blubb) DO (
Call WhateverUWant#
echo Fertig!
)

If [%date%]==[01.01.2007] (
...
) ELSE (
)

ist auch erlaubt.
Details siehe unter
IF /?
FOR /?
SET /?

am CMD-Prompt.

Gruß Biber

/Edit: die zweite Frage: Suche mal über Forumssuche hier nach "DelayedExpansion".
Da hab ich das schon mal erklärt.
Member: Xaero1982
Xaero1982 Apr 05, 2006 at 12:12:10 (UTC)
Goto Top
Ok, nun mal ne blöde Frage:

Was genau ist dein Ziel?

Bitte mal präzise schreiben was du GENAU machen und haben willst?!?
Member: The-Warlord
The-Warlord Apr 05, 2006 at 13:17:11 (UTC)
Goto Top
Xaero1982 mach ich

Ich will ein Skript schreiben, dass mir aus meiner Datei (Netzlaufwerk.dat) eine anzahl von Zeilen ausliest (mit Netzlaufwerkpfaden).

1. Mit diesen Pfaden soll ein Netzlaufwerk erstellt werden (net use x: %pfad%)
2. jetzt wollte mir über den DIR Befehl die grösse des verfügbaren Speicherplatzes angezeigen lassen (Zeile raussuchen, token auswählen, in Mbyte konvertieren) diese Information muss dann in eine Textdatei geschreiben werden.
3. Das Netzlaufwerk wieder trennen
4. Punkte 1-3 abarbeiten bis EOF von Netzlaufwerkdatei erreicht ist
5. per telnet diese Informationen an eine E-mail Adresse schicken

Die batch-Datei soll weiterhin keine Eingaben benötigen, sie soll als geplanter Task morgens die Inforamtionen an eine EMail-Adresse befördern.

Es gibt Tools die das vermögen (klickibunti... etc.), das ist mir schon bewusst
Mein ziel ist es durch diese kleine Aufgabe mir Grundkenntnisse im Bereich Batch-Shell, Syntax, programmiertechnisches Verständnis etc.
ein wenig zu steigern.

Da ich früher (1-2 Jahre her) mich mal mit der BASH ein wenig auseinander gesetzt habe (Automatisches Sicherungsskript für Oracle Datenbank auf Sun Solaris 8) kam ich zu den Grundgedanken die Shell von Windows zu nehmen, da siese für mich am ähnlichsten wirkt.
Das ich da gänzlich untalentiert bin sieht man ja an meinen postings.

Ich hoffe ich konnte Ziel und zweck einigermaßen vermitteln

Mir is natürlich auch wichtig eure Ansätze und techniken mitzunutzen, das eigentliche Skript wollte ich aber Selber schreiben (Lerneffekt).

Mir hat das ganze bis Jetzt auch schon geholfen, ich hatte leider bis Jetzt leider nur geringe Erfolgserlebnisse;-( (Bis auf die Tatsache das mir viele Leute helfen wollen, bzw. es getan haben) aber ich denke es wird schon.

Im Moment bin ich dabei die Verdammte Variablen deklaration bzw. das rechnen mit Variablen zu ergründen (Biber hat mir nen Link geposted so mit %%%i:~0,1%% Aktionen, da muss ich erstmal dahintersteigen)

Ach zu WSH... wenn ich noch nichma die Shell raffe denke ich sollte ich vom WSH erstmal die Finger lassen... Oder?
Member: Xaero1982
Xaero1982 Apr 05, 2006 at 13:28:33 (UTC)
Goto Top
Ach, das sehe ich nicht so ...
Ich hab auch keinen Schimmer von shell :o)

Und ein wenig von WSH

Und verflucht es hat auf diesem Planeten keiner AHnung von WMI außer den MS ScriptingGuys und die antworten nicht face-sad

Edit:
Das mit den Netzlaufwerkverbindungen ist z.b. in meinem Fall absolut überflüssig..

Per Telnet schicken? Na ich weiß nicht ...
Member: The-Warlord
The-Warlord Apr 05, 2006 at 13:48:52 (UTC)
Goto Top
Deine Skripte sehen aber ein wenig brutaler aus wei meine
Member: Xaero1982
Xaero1982 Apr 05, 2006 at 16:23:15 (UTC)
Goto Top
Ac h was denn face-smile ist doch alles easy
Member: The-Warlord
The-Warlord Apr 06, 2006 at 08:14:09 (UTC)
Goto Top
So ich hab eine vorläufige Variante meines Werkes *freu*

Nochmals Danke... Ohne VIEL Hilfe wärs nicht möglich gewesen

Skript:

@echo off & setlocal enabledelayedexpansion

set lwchar=x:

for /f %%a in (Netzlaufwerke.dat) do (
@354 use %lwchar% %%a
@echo net use %lwchar% %%a

@for /f "tokens=3" %%i in ('dir /-c %lwchar%^|find /i "Bytes fre"') do (
@echo Laufwerk %%a hat noch %%i freier Speicherplatz >> fs_info.txt
)
@354 use %lwchar% /delete
)

Ergebnis:
Ich bin Glücklichface-wink

Okay dann zupflückt mal mein slow & dirty Skriptface-wink)

Edit:
Die umrechnung in MByte fehlt noch, ausserdem wollte ich noch die Plausiblitäts Prüfung einbauen (Wenn ein Netzlaufwerk nicht verfügbar ist)