pretznbaer
Goto Top

Besitzer von Ordnern UND Dateien mit vbs in excel ausgeben

Hallo!
Ich müsste eine Script erstellen, dass alle Ordner und dessen Inhalte in einem Verzeichnis + deren Besitzerinformationen in ein excel File ausgibt. Habe hierzu schon ein paar (ältere) Threats gefunden, die mich fast auf die richtige Lösung gebracht haben (Besitzer von Ordnern mit VB-Script auslesen).

Dies ist der Code, den ich aus dem oben genannten Threat kopiert habe:

ordner = "C:\Downloads"
Liste = "C:\Liste.csv"
Set fs = CreateObject("Scripting.FileSystemObject")
Set f1 = fs.GetFolder(ordner)
If fs.FileExists(Liste) Then fs.DeleteFile(Liste)
Set WshShell = CreateObject("WScript.Shell")
For Each unterordner In f1.Subfolders
listunter = listunter & unterordner & vbcrlf
CMD = "cmd /c for /f ""skip=7 tokens=4*"" %a in ('dir """ & unterordner & """/q^|findstr /v ""Datei(en) Verzeichnis(se)""') do @echo %a;%b"
besitzer = WshShell.Exec(CMD).StdOut.ReadAll
listunter = listunter & besitzer & vbcrlf
Next
fs.CreateTextFile(Liste).Write listunter


Weiters wäre es von Vorteil, wenn die Dateibezeichnung des ausgegebene Files immer als Präfix das jeweilige Erstellungsdatum hätte. Beispiel: "2012 11 20 Liste.csv"
Leider habe ich keine Ahnung, wie ich dies in den Code oben einbauen sollte.


Bin leider nicht sooo vertraut mit der Materie und komme einfach nicht auf die richtige Lösung -.-
Vielleicht kann mir hierzu jemand helfen?

Lg
Pretznbär

Content-ID: 194584

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

Ausgedruckt am: 29.11.2024 um 14:11 Uhr

bastla
bastla 20.11.2012 aktualisiert um 18:11:15 Uhr
Goto Top
Hallo Pretznbaer und willkommen im Forum!

Wenn es nur um den Dateinamen gehen sollte:
Liste = "C:\" & Right(Date, 4) & " " & Mid(Date, 4, 2) & " " & Left(Date, 2) & " Liste.csv"
- oder hattest Du noch eine andere Frage?

Grüße
bastla

P.S.: VBS braucht's dafür aber eigentlich gar nicht - ließe sich auch per Batch erledigen (ungetestet):
@echo off & setlocal
set "Ordner=C:\Downloads"  
set "Liste=C:\%date:~-4% %date:~-7,2% %date:~-10,2% Liste.csv"  
del "%Liste%" 2>nul  

for /d %%i in ("%Ordner%\*") do (  
    echo %%i
    for /f "skip=7 tokens=4*" %%a in ('dir "%%i" /q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%a;%%b  
)>>"%Liste%"  
Pretznbaer
Pretznbaer 21.11.2012 um 09:30:11 Uhr
Goto Top
Hallo Bastla!

Deine Lösung war fast perfekt --> GENIAL!

Habe lediglich folgenden Code

Zitat von @bastla:
del "%Liste%" 2>nul

for /d %%i in ("%Ordner%\*") do (
echo %%i
for /f "skip=7 tokens=4*" %%a in ('dir "%%i" /q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%a;%%b
)>>"%Liste%"


durch diesen:

del "%Liste%" 2>nul
for /r "%Ordner%" %%i in (.) do for /f "skip=7 tokens=4*" %%a in ('dir "%%i" /ad /q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%~fi\%%b;%%a>>"%Liste%"

ersetzt und jetzt wird mir der komplette Inhalt des Ordners C:\Download ausgegeben. (Den Code habe ich übrigens auch von dir aus dem im Vorwort genannten Threat übernommen) ;)

Nochmals vielen Dank für die rasche Hilfe!!

Lg
Pretznbär
bastla
bastla 21.11.2012 um 12:21:42 Uhr
Goto Top
Hallo Pretznbaer!

Schön, dass es passt ... face-smile

Der Batchansatz hier war von der VBS-Version (wo es ja keine Rekursion gab) abgeleitet.

Grüße
bastla
Pretznbaer
Pretznbaer 23.11.2012 aktualisiert um 13:53:08 Uhr
Goto Top
Hallo!

Habe meine Frage leider voreilig als gelöst gekennzeichnet. Gibts hier eine Möglichkeit dies Rückgängig zu machen? Wenn ja bitte um kurze Info^^

Mir ist nämlich folgendes aufgefallen:

mit dem Script sollen alle Ordner und Dateien + deren Besitzer eines Verzeichnisses ausgegeben werden. Bis jetzt werden mir jedoch immer nur die Ordner und deren Besitzer ausgegen.
(Leider zu später gesehen)

Außerdem bringe ich das Script auf unseren Win server 2003 (englische Version falls das einen Unterschied macht?!) nicht richtig zum Laufen. Anstatt der Besitzer wird mir hier nur "..." oder "Bytes" ausgegeben.
An den Rechten kann es normalerweise nicht liegen, da ich quasi Adminrechte auf dem Server besitze.

Leider bin ich erst jetzt drauf gekommen -.- und hoffe das mir vl doch noch jemand nen Tipp geben kann? face-smile

Hier der Code den ich verwende:


1. @echo off & setlocal
2. set "Ordner=C:\Downloads"
3. set "Liste=C:\%date:~-4% %date:~-7,2% %date:~-10,2% Ordnerliste.csv"
4. del "%Liste%" 2>nul
5. for /r "%Ordner%" %%i in (.) do for /f "skip=7 tokens=4*" %%a in ('dir "%%
i" /ad /q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%~fi\%%b;%%a>>"%
Liste%"


P.S.: Sorry für die grottenschlechte Formatierung...


Lg
Pretznbaer
bastla
bastla 23.11.2012 um 15:23:07 Uhr
Goto Top
Hallo Pretznbaer!

Da es ja auch dem Titel des Threads besser entspricht face-wink, doch noch ein VBS-Ansatz:
Startordner = "C:\Downloads"  
Detail = "Owner" 'da engl. OS; dt: "Besitzer"  
'Formatiertes Datum für Dateinamen unabhängig von Sprache und Ländereinstellung ermitteln  
CSV = "C:\" & Year(Date) & " " & Right("0" & Month(Date), 2) & " " & Right("0" & Day(Date), 2) & " Ordnerliste.csv"  

Set objShell = CreateObject ("Shell.Application")  
Set fso = CreateObject("Scripting.FileSystemObject")  

'Nr der gesuchten Eigenschaft ("Owner") suchen, da abhängig vom OS  
Set objFolder = objShell.Namespace(Startordner)
DNr = -999
For i = 0 to 300
    If objFolder.GetDetailsOf (, i) = Detail Then
        DNr = i
        Exit For
    End If
Next
If DNr = -999 Then
    WScript.Echo "Die Eigenschaft """ & Detail & """ konnte nicht gefunden werden!"  
    WScript.Quit
End If

Set objCSV = fso.CreateTextFile(CSV) 'Ausgabedatei erstellen  
ProcessFolder fso.GetFolder(Startordner) 'Rekursion im Startordner beginnen  

Sub ProcessFolder(objFld)
strFldPath = objFld.Path 'Pfad des untersuchten Ordners zwischenspeichern - wird mehrmals benötigt  
Set objFolder = objShell.Namespace(strFldPath) 'Namespace-Objekt des Ordners erzeugen  
For Each objFile In objFld.Files 'alle Dateien des Ordners durchgehen  
    strFileName = objFile.Name 'Dateinamen zwischenspeichern  
    'Dateipfad und gesuchte Info in Zieldatei ausgeben  
    objCSV.WriteLine strFldPath & "\" & strFileName & ";" & objFolder.GetDetailsOf(objFolder.ParseName(strFileName), DNr)  
Next
For Each objSubFld In objFld.SubFolders 'alle Unterordner des Ordners durchgehen  
    strSubFldName = objSubFld.Name 'Orndernamen zwischenspeichern  
    'Ordnerpfad und gesuchte Info in Zieldatei ausgeben  
    objCSV.WriteLine strFldPath & "\" & strSubFldName & ";" & objFolder.GetDetailsOf(objFolder.ParseName(strSubFldName), DNr)  
    ProcessFolder objSubFld 'Bearbeitung des Unterordners aufrufen (Rekursion)  
Next
End Sub
Grüße
bastla
Pretznbaer
Pretznbaer 26.11.2012 um 14:00:06 Uhr
Goto Top
Hallo bastla!

Vorab nochmal vielen Dank für deine Bemühungen (ist nicht immer einfach einen Dummy wie ich einer bin, etwas zu erklären) ;)

Das Script funktioniert fast wie es soll. Bei den Dateien und den meisten Unterordnern werden die Besitzerinformationen richtig ausgegeben. Bei den "Überordner" jedoch wird mir als Besitzer immer "Owner" anstatt des tatsächlichen Besitzers ausgegeben.

Beispiel:

D:\Downloads --> Besitzer wird hier immer mit "Owner" ausgegeben wobei ich der eigentliche Besitzer bin.
D:\Downloads\Ordner_A --> Besitzer: Ich (ist also korrekt)
D:\Downloads\Ordner_A\Beispiel.pdf --> Besitzer: Ich (korrekt)

Hab schon einiges herum probiert aber bekomme immer wieder das gleiche Ergebnis.. Es macht keinen Unterschied ob ich das Script Lokal oder auf dem Server ausführe.

Hast du vl noch nen Tipp? :P

Lg
Pretznbaer
bastla
bastla 26.11.2012 um 16:21:27 Uhr
Goto Top
Hallo Pretznbaer!

Ich konnte das zwar bei einigen Ordnern nachvollziehen, habe aber derzeit keine Erklärung dafür face-sad ...

Grüße
bastla
Pretznbaer
Pretznbaer 26.11.2012 um 16:38:14 Uhr
Goto Top
Zitat von @bastla:
Hallo Pretznbaer!

Ich konnte das zwar bei einigen Ordnern nachvollziehen, habe aber derzeit keine Erklärung dafür face-sad ...

Grüße
bastla

Kein Problem. Ich werde etwas herum probieren und vl komme ich ja mit viel Glück auf das richtige Ergebnis! Und gebe dann natürlich Bescheid face-smile
Solltest du auch dahinter kommen, würde ich mich über eine kurze Info freuen!

Lg und vielen Dank!
Pretznbaer