Word Dateien nach Vorlage suchen
Wir haben hier in der Firma demnächst wieder eine Änderung der Dokumentenvorlagen. Im gleichen Zug wollen wir die Anzahl von 130 auf ca. 40 zurückschrauben. Das Problem ist nun rauszufinden, welche Vorlagen wirklich benutzt werden. Die Dateien liegen lokal bei jedem User unter D:\DokVorlagen (als Beispiel) und da in den entsprechenden Ordnern (Intern / Extern / Abteilung). Wir können daher (weil lokal) nicht scannen, wann welche Datei das letzte mal genutzt wurde bzw. ob es überhaupt noch genutzt wird.
Die derzeit einzige Möglichkeit die mir eingefallen ist: Scannen der Abteilungs- / User- / Ablagelaufwerke (am Wochenende) nach .doc Dateien. Ist es möglich zu sehen, welche Dateien aus welcher Vorlage erzeugt wurden und gibt es Tools / Scripte dafür? Dann könnte man eine Nutzungsstatistik erstellen und danach aussortieren. Hat sowas schonmal wer gemacht?
Für jeden andere Idee bin ich im übrigen auch dankbar...
Die derzeit einzige Möglichkeit die mir eingefallen ist: Scannen der Abteilungs- / User- / Ablagelaufwerke (am Wochenende) nach .doc Dateien. Ist es möglich zu sehen, welche Dateien aus welcher Vorlage erzeugt wurden und gibt es Tools / Scripte dafür? Dann könnte man eine Nutzungsstatistik erstellen und danach aussortieren. Hat sowas schonmal wer gemacht?
Für jeden andere Idee bin ich im übrigen auch dankbar...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 17233
Url: https://administrator.de/contentid/17233
Ausgedruckt am: 22.11.2024 um 17:11 Uhr
16 Kommentare
Neuester Kommentar
Wenn ihr die lokalen Pfade kennt, dann bau doch in das Loginscript ein DIR auf diese Pfade ein mit einer Umleitung in eine Textdatei auf dem Server.
Und alternativ: warum gehst Du nicht über die administrativen Freigaben auf die Clientrechner zum Scannen der Vorlagen?
hand/dba
Und alternativ: warum gehst Du nicht über die administrativen Freigaben auf die Clientrechner zum Scannen der Vorlagen?
hand/dba
Mein Beileid!
Versuch mal Treesize (http://www.jam-software.de/treesize/) ), vielleicht hilft Dir das Tool weiter. Du kannst damit auch auf jeden PC (über Admin-Shares), aber ist trotzdem Knochenarbeit.
Versuch mal Treesize (http://www.jam-software.de/treesize/) ), vielleicht hilft Dir das Tool weiter. Du kannst damit auch auf jeden PC (über Admin-Shares), aber ist trotzdem Knochenarbeit.
Hi,
ich hab da mal ein bisschen probiert (Delphi). Mit etwas Zeit, kriege ich da was hin.
Ich könnte auf die Schnelle eine Textdatei zaubern, die du dann in Excel auswerten kannst.
Falls Interesse besteht, gib mal Bescheid!
Psycho
ich hab da mal ein bisschen probiert (Delphi). Mit etwas Zeit, kriege ich da was hin.
Ich könnte auf die Schnelle eine Textdatei zaubern, die du dann in Excel auswerten kannst.
Falls Interesse besteht, gib mal Bescheid!
Psycho
So ungefähr würde es aussehen
D:\Dokumente\xyz.doc;Template: c:\Vorlagen\normal.dot
Man kann da auch noch mehr Infos raus holen (letzte Änderung usw.)
Ich denke mal, dass ich das bis morgen hin bekommen könnte.
Psycho
D:\Dokumente\xyz.doc;Template: c:\Vorlagen\normal.dot
Man kann da auch noch mehr Infos raus holen (letzte Änderung usw.)
Ich denke mal, dass ich das bis morgen hin bekommen könnte.
Psycho
ein paar Fragen noch:
->Ich würde alle lokalen Platten scannen?
->Soll das Proggi automatisch loslegen?
->Gibt es ein gemapptes Laufwerk für alle?
Dann könnte es so gehen: Progi in jenes LW legen und per Richtlinie( ist nicht mein Fach) starten. Für jeden Rechner eine Datei erstellen bzw. alles in eine schmeißen (ich weiß ja nicht wie viele das werden!) Die einträge per ";" trennen, damit kommt Excel dann klar.
Das Proggi an sich geht schon, muß nur noch ein paar Feinheiten ändern!
Psycho
->Ich würde alle lokalen Platten scannen?
->Soll das Proggi automatisch loslegen?
->Gibt es ein gemapptes Laufwerk für alle?
Dann könnte es so gehen: Progi in jenes LW legen und per Richtlinie( ist nicht mein Fach) starten. Für jeden Rechner eine Datei erstellen bzw. alles in eine schmeißen (ich weiß ja nicht wie viele das werden!) Die einträge per ";" trennen, damit kommt Excel dann klar.
Das Proggi an sich geht schon, muß nur noch ein paar Feinheiten ändern!
Psycho
Moin MTM,
wenns mal etwas länger dauert....
bzw. bis Psycho was Professionelles hat, hab ich solange einen Batch-Oneliner für Dich:
(ist alles in einer Zeile!)
Ausgabe bei mir:
einige Word-*docs haben mehrere Vorlagen, deshalb die innere FOR-Schleife.
(siehe die dommig.doc oben)
HTH
Frank / der Biber aus Bremen
wenns mal etwas länger dauert....
bzw. bis Psycho was Professionelles hat, hab ich solange einen Batch-Oneliner für Dich:
(ist alles in einer Zeile!)
--------snipp ListAllDocNDots.bat
@echo off & for /r E:\ %%i in (*.doc) do for /f %%a in ('type "%%i"^|find /i ".DOT"') do if errorlevel 0 echo %%~i;%%a;%%~ti
----------snapp ListAllDocNDots.bat
Ausgabe bei mir:
E:\Microsoft\rk\W2KSupporttools\ldp.doc;Normal.dot;28.05.2001 23:05
E:\Microsoft\rk\W2KSupporttools\dskprtrb.doc;Normal.dot;28.05.2001 23:00
E:\Microsoft\rk\W2KSupporttools\dommig.doc;Normal.dot;20.03.2002 06:39
E:\Microsoft\rk\W2KSupporttools\dommig.doc;Windows;20.03.2002 06:39
E:\Microsoft\rk\W2KSupporttools\sreadme.doc;Normal.dot;19.04.2002 15:41
E:\Microsoft\rk\W2KSupporttools\iadstools.doc;Normal.dot;28.05.2001 23:06
E:\jokes\Windows_fehlermeldungen.doc;Normal.dot;30.08.2005 15:58
E:\jokes\revengeo.doc;Normal.dot;22.08.2005 10:38
....
einige Word-*docs haben mehrere Vorlagen, deshalb die innere FOR-Schleife.
(siehe die dommig.doc oben)
HTH
Frank / der Biber aus Bremen
Guten Morgen,
wenns mal etwas länger dauert....
... man hat ja noch andere Vepflichtungen!
Ich wäre dann aber auch soweit!
Das Proggi speichert die Ausgabe im Programmverzeichnis unter [Computername].csv
Es legt beim Start sofort los und beendet sich wieder, der User merkt kaum was - es geht recht schnell.
Falls Interesse besteht; PN mit Mail-Addi an mich und ab gehts.
Psycho
wenns mal etwas länger dauert....
... man hat ja noch andere Vepflichtungen!
Ich wäre dann aber auch soweit!
Das Proggi speichert die Ausgabe im Programmverzeichnis unter [Computername].csv
Es legt beim Start sofort los und beendet sich wieder, der User merkt kaum was - es geht recht schnell.
Falls Interesse besteht; PN mit Mail-Addi an mich und ab gehts.
Psycho
Gib mir mal deine Mail-Adresse durch, dann schicke ich dir was zum testen.
Ist dann einfacher, für mich, deine Wünsche einzubauen!
Psycho
Ist dann einfacher, für mich, deine Wünsche einzubauen!
Psycho
Guten Morgen,
auf Wunsch der Batch-Fraktion stelle ich mal vor, wie sowas unter Delphi aussehen könnte:
function GetFileProperty(const FileName: WideString): string;
var
i : Integer;
PropSetStg : IPropertySetStorage;
PropSpec : array[2..19] of TPropSpec;
PropStg : IPropertyStorage;
PropVariant : array[2..19] of TPropVariant;
Rslt : HResult;
S : string;
Stg : IStorage;
begin
Result := '';
try
OleCheck(StgOpenStorage(PWideChar(FileName), nil, STGM_READ or
STGM_SHARE_DENY_WRITE,
nil, 0, Stg));
PropSetStg := Stg as IPropertySetStorage;
OleCheck(PropSetStg.Open(FmtID_SummaryInformation,
STGM_READ or STGM_SHARE_EXCLUSIVE, PropStg));
for I := 2 to 19 do
begin
PropSpec[I].ulKind := PRSPEC_PROPID;
PropSpec[I].PropID := I;
end;
Rslt := PropStg.ReadMultiple(18, @propspec, @propvariant);
OleCheck(Rslt);
if Rslt <> S_FALSE then for I := 2 to 19 do
begin
S := '';
if PropVariant[I].vt = VT_LPSTR then
if Assigned(PropVariant[I].pszVal) then
S := PropVariant[I].pszVal;
case I of
2: S := Format('Title: %s', [S]);
3: S := Format('Subject: %s', [S]);
4: S := Format('Author: %s', [S]);
5: S := Format('Keywords: %s', [S]);
6: S := Format('Comments: %s', [S]);
7: Begin
S := Format(';%s', [S]);
Result := S;
End;
8: S := Format('Last saved by: %s', [S]);
9: S := Format('Revision number: %s', [S]);
10: S := Format('Total editing time: %g sec',
[Comp(PropVariant[I].filetime) / 1.0E9]);
11: S := Format('Last printed: %s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
12: S := Format('Create time/date: %s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
13: Begin
S := Format(';%s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
result := result + S;
End;
14: S := Format('Number of pages: %d', [PropVariant[I].lVal]);
15: S := Format('Number of words: %d', [PropVariant[I].lVal]);
16: S := Format('Number of characters: %d',
[PropVariant[I].lVal]);
17:; // thumbnail
18: S := Format('Name of creating application: %s', [S]);
19: S := Format('Security: %.8x', [PropVariant[I].lVal]);
end;
end;
finally
end;
end;
procedure GetAllFiles(mask: string);
var
search : TSearchRec;
directory : string;
property : String;
sl : TStringList;
i : Integer;
begin
sl := TStringList.Create;
directory := ExtractFilePath(mask);
find all files
if FindFirst(mask, $23, search) = 0 then
begin
repeat
Try
property := GetDocInfo(directory + search.Name);
Except
property := ';;';
End;
sl.Add(directory + search.Name + property);
until FindNext(search) <> 0;
end;
if FindFirst(directory + '*.*', faDirectory, search) = 0 then
begin
repeat
if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> '.') then
GetAllFiles(directory + search.Name + '\' + ExtractFileName(mask));
until FindNext(search) <> 0;
FindClose(search);
end;
sl.SaveToFile(ausgabe);
sl.Destroy;
end;
Mein Dank geht hierbei auch an eine sehr gute Delphi-Seite : http://www.delphi-tipps.de
Psycho
auf Wunsch der Batch-Fraktion stelle ich mal vor, wie sowas unter Delphi aussehen könnte:
function GetFileProperty(const FileName: WideString): string;
var
i : Integer;
PropSetStg : IPropertySetStorage;
PropSpec : array[2..19] of TPropSpec;
PropStg : IPropertyStorage;
PropVariant : array[2..19] of TPropVariant;
Rslt : HResult;
S : string;
Stg : IStorage;
begin
Result := '';
try
OleCheck(StgOpenStorage(PWideChar(FileName), nil, STGM_READ or
STGM_SHARE_DENY_WRITE,
nil, 0, Stg));
PropSetStg := Stg as IPropertySetStorage;
OleCheck(PropSetStg.Open(FmtID_SummaryInformation,
STGM_READ or STGM_SHARE_EXCLUSIVE, PropStg));
for I := 2 to 19 do
begin
PropSpec[I].ulKind := PRSPEC_PROPID;
PropSpec[I].PropID := I;
end;
Rslt := PropStg.ReadMultiple(18, @propspec, @propvariant);
OleCheck(Rslt);
if Rslt <> S_FALSE then for I := 2 to 19 do
begin
S := '';
if PropVariant[I].vt = VT_LPSTR then
if Assigned(PropVariant[I].pszVal) then
S := PropVariant[I].pszVal;
case I of
2: S := Format('Title: %s', [S]);
3: S := Format('Subject: %s', [S]);
4: S := Format('Author: %s', [S]);
5: S := Format('Keywords: %s', [S]);
6: S := Format('Comments: %s', [S]);
7: Begin
S := Format(';%s', [S]);
Result := S;
End;
8: S := Format('Last saved by: %s', [S]);
9: S := Format('Revision number: %s', [S]);
10: S := Format('Total editing time: %g sec',
[Comp(PropVariant[I].filetime) / 1.0E9]);
11: S := Format('Last printed: %s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
12: S := Format('Create time/date: %s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
13: Begin
S := Format(';%s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
result := result + S;
End;
14: S := Format('Number of pages: %d', [PropVariant[I].lVal]);
15: S := Format('Number of words: %d', [PropVariant[I].lVal]);
16: S := Format('Number of characters: %d',
[PropVariant[I].lVal]);
17:; // thumbnail
18: S := Format('Name of creating application: %s', [S]);
19: S := Format('Security: %.8x', [PropVariant[I].lVal]);
end;
end;
finally
end;
end;
procedure GetAllFiles(mask: string);
var
search : TSearchRec;
directory : string;
property : String;
sl : TStringList;
i : Integer;
begin
sl := TStringList.Create;
directory := ExtractFilePath(mask);
find all files
if FindFirst(mask, $23, search) = 0 then
begin
repeat
Try
property := GetDocInfo(directory + search.Name);
Except
property := ';;';
End;
sl.Add(directory + search.Name + property);
until FindNext(search) <> 0;
end;
if FindFirst(directory + '*.*', faDirectory, search) = 0 then
begin
repeat
if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> '.') then
GetAllFiles(directory + search.Name + '\' + ExtractFileName(mask));
until FindNext(search) <> 0;
FindClose(search);
end;
sl.SaveToFile(ausgabe);
sl.Destroy;
end;
Mein Dank geht hierbei auch an eine sehr gute Delphi-Seite : http://www.delphi-tipps.de
Psycho