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

Dateimasken bzw. Wildcards in VBScript

Anleitung Entwicklung Batch & Shell

Mitglied: Friemler

Friemler (Level 2) - Jetzt verbinden

05.07.2011, aktualisiert 23.08.2014, 12562 Aufrufe, 7 Kommentare

VBScript bietet keine Möglichkeit, z.B. beim Einlesen einer Files Collection eine Dateimaske vorzugeben; es werden immer alle Dateien des betreffenden Verzeichnisses geliefert. Aus gegebenem Anlass benötigte ich aber dieses Feature und habe deshalb eine VBS-Klasse für diesen Zweck geschrieben, deren Code ich hiermit der Öffentlichkeit zur Verfügung stellen möchte.

Der Code liefert nicht die selben Ergebnisse wie der DIR-Befehl der Kommandozeile, denn dessen Pattern Matching Algorithmus ist, wie so viele Konsolenbefehle, nicht fehlerfrei implementiert, d.h. er hält sich nicht exakt an die definierte Bedeutung des Wildcardzeichens ?.

Das Fragezeichen steht für ein beliebiges Zeichen, das genau einmal vorkommen muss. Bei folgender Verzeichnisstruktur
test.text 
test2.txt
liefert der Befehl
dir /b t?t*.txt
wie erwartet kein Ergebnis. Der Befehl
dir /b t??t????????.txt
liefert jedoch beide Dateinamen zurück, was nicht der Definition von ? entspricht. Der hier vorgestellte Code liefert das korrekte Ergebnis, nämlich nichts.


Trotzdem möchte ich betonen, dass der Code zwar getestet ist, aber trotzdem die Möglichkeit besteht,
dass er in speziellen Fällen falsche bzw. unvollständige Ergebnisse liefert. Verwendung auf eigene Gefahr!


Hinweise diesbezüglich sind mir sehr willkommen.


Jetzt aber erstmal der Code:
01.
Class clsFileNameMatch 
02.
  Private objFSO 
03.
 
04.
 
05.
  Private Sub Class_Initialize() 
06.
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
07.
  End Sub 
08.
 
09.
 
10.
  Private Sub Class_Terminate() 
11.
    Set objFSO = Nothing 
12.
  End Sub 
13.
 
14.
 
15.
  Private Function FindMatch(ByRef strString, ByRef strPattern, ByVal intIdxStr, ByVal intIdxPattern) 
16.
    Dim chrString, chrPattern 
17.
 
18.
    While (intIdxStr <= Len(strString)) And (intIdxPattern <= Len(strPattern)) 
19.
      chrString  = Mid(strString, intIdxStr, 1) 
20.
      chrPattern = Mid(strPattern, intIdxPattern, 1) 
21.
 
22.
      If chrPattern <> "*" Then 
23.
        FindMatch = (UCase(chrString) = UCase(chrPattern) Or chrPattern = "?") 
24.
        If Not FindMatch Then Exit Function 
25.
 
26.
        intIdxStr     = intIdxStr + 1 
27.
        intIdxPattern = intIdxPattern + 1 
28.
      Else 
29.
        FindMatch = (intIdxPattern = Len(strPattern)) 
30.
        If FindMatch Then Exit Function 
31.
 
32.
        Do 
33.
          FindMatch = FindMatch(strString, strPattern, intIdxStr, intIdxPattern + 1) 
34.
          intIdxStr = intIdxStr + 1 
35.
        Loop Until FindMatch Or intIdxStr > Len(strString) 
36.
 
37.
        Exit Function 
38.
      End If 
39.
    Wend 
40.
 
41.
    If (intIdxStr <= Len(strString)) Or (intIdxPattern <= Len(strPattern)) Then FindMatch = False 
42.
    If (intIdxStr > Len(strString)) And (intIdxPattern = Len(strPattern)) And (Right(strPattern, 1) = "*") Then FindMatch = True 
43.
  End Function 
44.
 
45.
 
46.
  Public Function FileNameMatch(ByRef strFileName, ByRef strPattern) 
47.
    Dim strName, strExt, strPatternName, strPatternExt 
48.
 
49.
    strName = objFSO.GetBaseName(strFileName) 
50.
    strExt  = objFSO.GetExtensionName(strFileName) 
51.
 
52.
    strPatternName = objFSO.GetBaseName(strPattern) 
53.
    strPatternExt  = objFSO.GetExtensionName(strPattern) 
54.
 
55.
    If strPatternName = "" Then strPatternName = "*" 
56.
    If strPatternExt  = "" Then strPatternExt  = "*" 
57.
 
58.
    FileNameMatch = FindMatch(strName, strPatternName, 1, 1) And FindMatch(strExt, strPatternExt, 1, 1) 
59.
  End Function 
60.
End Class
Die öffentliche Funktion FileNameMatch der Klasse zerlegt den Dateinamen und das Suchmuster in die Bestandteile Name und Erweiterung und prüft beides separat auf eine Übereinstimmung durch Aufruf der privaten Funktion FindMatch. Wenn beides dem angegebenen Suchmuster entspricht, wird True zurückgeliefert, sonst False.

Die Hauptschleife in den Zeilen 18 bis 39 prüft die einzelnen Zeichen des Dateinamens und der Suchmaske auf Gleichheit. Ein Fragezeichen in der Suchmaske wird als Übereinstimmung gewertet.

Wenn ein Stern/Asterisk in der Suchmaske gefunden wird, wird zunächst geprüft, ob es sich um das letzte Zeichen der Suchmaske handelt. Wenn ja haben wir einen Treffer. Wenn nicht, ruft sich die Funktion in Zeile 33 selbst auf. Die Position des Zeichenzeigers in die Suchmaske wird für die neue Instanz um eins erhöht (intIdxPattern + 1). Die neue Instanz der Funktion sucht also nach Übereinstimmungen ab der gleichen Position im Dateinamen und der um eins erhöhten Position in der Suchmaske (hinter dem Asterisk).

Wenn die neue Instanz keine Übereinstimmung gefunden hat, wird nach der Rückkehr der Positionszeiger intIdxStr in den Dateinamen um eins erhöht und, wenn die Abbruchbedingungen der Schleife nicht erfüllt sind, wieder eine Instanz der Funktion aufgerufen. intIdxPattern hat dabei wieder den gleichen Wert wie beim letzten Aufruf. Die Schleife und damit, wegen Zeile 37, auch die Funktion bricht ab, wenn ein Treffer gefunden wurde oder alle Zeichen des Dateinamens überprüft wurden.

Zeile 41 dient dazu den Fall zu erkennen, dass die Hauptschleife beendet wurde, weil nur einer der beiden Strings bis zum letzten Zeichen verarbeitet wurde. Dann liegt kein Treffer vor.

Zeile 42 ist für den Sonderfall, dass der Dateiname schon vollständig verarbeitet wurde, der Positionszeiger für die Suchmaske aber erst auf dem letzten Zeichen steht und dieses Zeichen ein Asterisk ist. Dann liegt ein Treffer vor (Ausnahme von der Ausnahme ).


Jetzt ein Beispiel zur Verwendung. Der obige Code muss in die Datei mit dem folgenden Code kopiert werden.
01.
Const ForReading = 1 
02.
Const AsASCII    = 0 
03.
 
04.
intResult        = 1 
05.
 
06.
If WScript.Arguments.Count > 0 Then 
07.
  arrFilesToOpen  = Array() 
08.
  Set objFNMatch  = New clsFileNameMatch 
09.
  Set objFSO      = CreateObject("Scripting.FileSystemObject") 
10.
 
11.
  strMask         = WScript.Arguments(0) 
12.
  strFolder       = objFSO.GetParentFolderName(strMask) 
13.
  strFileName     = objFSO.GetFileName(strMask) 
14.
 
15.
  If strFolder = "" Then strFolder = "." 
16.
 
17.
  If objFSO.FolderExists(strFolder) Then 
18.
    Set objFolder   = objFSO.GetFolder(strFolder) 
19.
    Set colAllFiles = objFolder.Files 
20.
 
21.
    For Each objFile In colAllFiles 
22.
      If objFNMatch.FileNameMatch(objFile.Name, strFileName) Then 
23.
        ReDim Preserve arrFilesToOpen(UBound(arrFilesToOpen) + 1) 
24.
        Set arrFilesToOpen(UBound(arrFilesToOpen)) = objFile 
25.
      End If 
26.
    Next 
27.
 
28.
    If UBound(arrFilesToOpen) >= 0 Then 
29.
      For Each objFile In arrFilesToOpen 
30.
        WScript.Echo "Datei " & objFile.Path & " wird geöffnet." 
31.
 
32.
        Set objStream = objFile.OpenAsTextStream(ForReading, AsASCII) 
33.
34.
        'Dateiinhalt verarbeiten 
35.
36.
        objStream.Close 
37.
      Next 
38.
 
39.
      intResult = 0 
40.
    Else 
41.
      WScript.Echo "Keine Datei(en) gefunden." 
42.
    End If 
43.
  Else 
44.
    WScript.Echo "Verzeichnis nicht gefunden." 
45.
  End If 
46.
Else 
47.
  WScript.Echo "Bitte eine Dateimaske übergeben!" 
48.
End If 
49.
 
50.
WScript.Quit intResult
Aufruf:
cscript /nologo example.vbs D:\Texte\*.txt
In Zeile 19 wird eine Files Collection erzeugt, die alle Dateien des übergebenen Verzeichnisses enthält. Jeder Dateiname wird in Zeile 22 auf Übereinstimmung mit dem übergebenen Muster geprüft und bei einem Treffer das File Objekt in das Array arrFilesToOpen gespeichert, das dafür jedesmal dynamisch vergrößert wird.

Über die Abfrage in Zeile 28 lässt sich feststellen, ob passende Dateien gefunden wurden. Es wird dann durch das Array iteriert, um mit jeder Datei die vorgesehene Aktion auszuführen. Im Beispiel wird der komplette Dateipfad angezeigt und die Datei zum Lesen geöffnet.

Gruß
Friemler
Mitglied: 60730
06.07.2011 um 21:19 Uhr
Servus Friemler,

ich trau mich ja fast nicht, dich zu fragen - aber machs trotzdem.

Das "Problem" ist mir auch schon mal aufgestossen und bei einer Struktur
C:\>dir /b C:\script\friemler\* 
test.cmd 
test.txt 
test1.txt 
test2.txt
liefert wie du oben schon aufgeführt hast ein
C:\>dir /b C:\script\friemler\t??t?.txt 
test.txt 
test1.txt 
test2.txt
nicht das, was man erwarten würde.

Ein gerade für dich simples
C:\>dir /b C:\script\friemler | findstr /i "t..t..txt" 
test1.txt 
test2.txt
bringt aber doch genau das, was gewünscht - war dir das zu einfach?

Trotzdem, oder gerade weil - 1.001 Dank für die Mühe.
Bitte warten ..
Mitglied: Friemler
06.07.2011 um 22:06 Uhr
Hi Timo,

Zitat von 60730:
... bringt aber doch genau das, was gewünscht - war dir das zu einfach?

ich wollte ja eine Möglichkeit haben, innerhalb eines VBScript Wildcards zu verarbeiten, ohne auf eine Batch-Krücke angewiesen zu sein. Das wäre für das Projekt, wegen dem ich das obige Script geschrieben habe, nicht praktikabel gewesen.

Innerhalb von VBS einen DIR-Befehl abzusetzen und dessen Ausgabe zu parsen ging mir gegen den Strich (Provisorium, unelegant, grummel ).

Mein eigentliches Ziel war auch nicht, besser als die Redmonder Praktikanten zu sein. Ich wollte eigentlich die Ausgabe des DIR-Befehls zum Gegenprüfen meines Scripts benutzen, das ging aber aus den o.g. Gründen nicht.

Aber ansonsten hast Du natürlich recht mit dem FINDSTR-Behelf.

Schönen Abend
Friemler
Bitte warten ..
Mitglied: Skyemugen
07.07.2011 um 08:22 Uhr
Aloha T-Mo,

stimmt, das hatte ich letztens erst, habe nach ?.* gesucht und bekam dann auch als Ergebnis: ._descrip.mms ich wunderte mich schon ... aber gut, dein simpler Test bestätigt es ja, dass dies ein immerwährender bug ist ... wobei das mit dem Punkt nach dem Fragezeichen zusammenhängen muss, denn in anderen Positionen kann ich das Phänomen nicht produzieren.

greetz André

... ob das in dem anderen Thread dann so funktioniert ... ??.??.????.doc ... ich bin gespannt, der TE gibt ja kein Feedback
edit: ??.??.????.doc findet auch Dateien mit 9.3.11.doc ... also nicht nur eine Stelle, sondern sogar mehrere Stellen weniger als angegeben ...
Bitte warten ..
Mitglied: rubberman
08.07.2011 um 19:42 Uhr
Hallo Friemler.

Da hast du eine Menge Hirnschmalz reingesteckt. Vermutlich einfacher wäre die Verwendung von Regulären Ausdrücken gewesen.
Diese (nur ansatzweise getestete) Funktion sollte es eigentlich schon tun:
01.
Function FileNameMatch(strFileName, byVal strPattern) 
02.
  arrSpecialChars = Array("^", "$", "+", ".", "(", ")", "{", "}", "[", "]") 
03.
  For Each strSpecialChar In arrSpecialChars 
04.
    strPattern = Replace(strPattern, strSpecialChar, "\" & strSpecialChar) 
05.
  Next 
06.
  strPattern = Replace(strPattern, "?", ".") 
07.
  strPattern = "^" & Replace(strPattern, "*", ".*") & "$" 
08.
  Set objRegEx = New RegExp 
09.
  objRegEx.IgnoreCase = True 
10.
  objRegEx.Pattern = strPattern 
11.
  FileNameMatch = objRegEx.Test(strFileName) 
12.
  Set objRegEx = Nothing 
13.
End Function
Grüße
rubberman

<Edit: byVal ergänzt />
Bitte warten ..
Mitglied: Friemler
08.07.2011 um 20:27 Uhr
Moin rubberman,

das mit den Regulären Ausdrücken war auch zuerst meine Idee. Dabei war mir natürlich auch das Problem der zu maskierenden Metazeichen eingefallen. Ich hätte allerdings gründlicher darüber nachdenken sollen (so gründlich, wie beim Entwurf meines Algorithmus' ), denn ich hatte mir die Sache aufwändiger vorgestellt.

Aber gut, jetzt haben wir schon zwei Lösungen für das Problem . Allerdings muss strPattern ByVal übergeben oder einer funktionsinternen Hilfsvariable zugewiesen werden (besser), mit der dann weitergearbeitet wird, sonst wird der String des Aufrufers durch die Funktion verändert, was bei mehrmaligem Aufruf zu einem immer länger werdenden Pattern und einer Fehlfunktion führt.

Hier wäre dann noch die dritte Lösung, die ich in meiner Antwort auf Timo's Posting schon angesprochen hatte: Das Ausführen eines DIR-Befehls aus VBS heraus und parsen von dessen Ausgabe. Ich denke dann wären wir komplett . Aber Deine Lösung ist natürlich die kürzeste und birgt keine Gefahr eines Stacküberlaufs wegen zu tiefer Rekursion (zumindest wenn man sich da auf den Windows Script Host verlassen kann - BTW: Haben die Redmonder den eigentlich selbst geschrieben oder wie so manches andere in Windows, was gut funktioniert, zugekauft? ).

01.
Const GetFiles   = 0 
02.
Const GetFolders = 1 
03.
 
04.
 
05.
If WScript.Arguments.Count > 0 Then 
06.
  Set objWildcards = New clsWildcards 
07.
 
08.
  If WScript.Arguments.Count > 1 Then 
09.
    strAttrib = WScript.Arguments(1) 
10.
  Else 
11.
    strAttrib = "" 
12.
  End If 
13.
 
14.
 
15.
  arrFolders = objWildcards.GetFSItems(WScript.Arguments(0), strAttrib, GetFolders) 
16.
 
17.
  For Each strFolder In arrFolders 
18.
    WScript.Echo strFolder 
19.
  Next 
20.
 
21.
  If UBound(arrFolders) >= 0 Then Erase arrFolders 
22.
 
23.
 
24.
  WScript.Echo 
25.
 
26.
 
27.
  arrFiles = objWildcards.GetFSItems(WScript.Arguments(0), strAttrib, GetFiles) 
28.
 
29.
  For Each strFile In arrFiles 
30.
    WScript.Echo strFile 
31.
  Next 
32.
 
33.
  If UBound(arrFiles) >= 0 Then Erase arrFiles 
34.
End If 
35.
 
36.
 
37.
 
38.
 
39.
'************ Klasse zur Behandlung von Wildcards mit Hilfe des DIR-Kommandos ************** 
40.
 
41.
Class clsWildcards 
42.
  Private objFSO 
43.
 
44.
 
45.
  Private Sub Class_Initialize() 
46.
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
47.
  End Sub 
48.
 
49.
 
50.
  Private Sub Class_Terminate() 
51.
    Set objFSO = Nothing 
52.
  End Sub 
53.
 
54.
 
55.
  'DIR-Befehl ausführen und Ausgabe zeilenweise in ein Array schreiben 
56.
  Private Function GetItems(strMask, strAttrib) 
57.
    Dim objShell, objExec 
58.
 
59.
    Set objShell = CreateObject("WScript.Shell") 
60.
    Set objExec  = objShell.Exec("%comspec% /c " & Chr(34) & "Dir /b /o:ne " & strAttrib & " " & Chr(34) & strMask & Chr(34) & Chr(34)) 
61.
    GetItems     = Split(objExec.StdOut.ReadAll, vbCRLF) 
62.
  End Function 
63.
 
64.
 
65.
  'Eingabedaten vorbereiten, DIR-Befehl ausführen und dessen Ausgabe nachbearbeiten 
66.
  Public Function GetFSItems(strMask, strAttrib, intKind) 
67.
    Dim I, str_Attrib, str_Mask, arrItems 
68.
 
69.
    arrItems = Array() 
70.
 
71.
    str_Mask = objFSO.GetAbsolutePathName(strMask) 
72.
 
73.
    If objFSO.FolderExists(str_Mask) Then 
74.
      str_Mask = objFSO.BuildPath(str_Mask, "\*.*") 
75.
    End If 
76.
 
77.
    'Sollen Dateien oder Verzeichnisse ermittelt werden? 
78.
    If intKind = 0 Then 
79.
      'DIR für Dateien ausführen 
80.
      arrItems = GetItems(str_Mask, "/a:-d" & str_Attrib) 
81.
    Else 
82.
      'DIR für Verzeichnisse ausführen 
83.
      arrItems = GetItems(str_Mask, "/a:d" & str_Attrib) 
84.
    End If 
85.
 
86.
    'Zusätzliche Leerzeile der Ausgabe von DIR entfernen 
87.
    If UBound(arrItems) >= 0 Then ReDim Preserve arrItems(UBound(arrItems) - 1) 
88.
 
89.
    'Pfad des Elternverzeichnisses vor die Elemente setzen 
90.
    For I = 0 To UBound(arrItems) 
91.
      arrItems(I) = objFSO.BuildPath(objFSO.GetParentFolderName(str_Mask), arrItems(I)) 
92.
    Next 
93.
 
94.
    GetFSItems = arrItems 
95.
  End Function 
96.
End Class
Die Zeilen 1 bis 34 sind wieder Beispielcode zur Anwendung der Klasse.

Die Methode GetFSItems liefert ein Array mit den vollständigen Pfaden aller auf die Maske passenden Dateien bzw. Verzeichnisse. Was gesucht werden soll (Dateien oder Verzeichnisse) wird durch den dritten Parameter intKind bestimmt. Ob Dateien/Verzeichnisse mit den Attributen Hidden bzw. System gefunden werden sollen, kann mit dem zweiten Parameter strAttrib ausgewählt werden.

Gruß
Friemler


PS:
Da fällt mir gerade aber noch ein, dass es bei dieser Methode wahrscheinlich zu fehlerhaften Ausgaben von Umlauten äöüß und anderen Zeichen kommt, die in ANSI und ASCII verschieden codiert sind. Na ja, dann ist es halt keine Methode sondern ein Konzept .
Bitte warten ..
Mitglied: rubberman
08.07.2011 um 22:05 Uhr
Hallo Friemler.

Zitat von Friemler:
Allerdings muss strPattern ByVal übergeben
oder einer funktionsinternen Hilfsvariable zugewiesen werden (besser), mit der dann weitergearbeitet wird


ByVal ist die bessere Variante, da auch eine Hilfsvariable global vordefiniert sein könnte und somit verändert würde.
Danke für den Hinweis, ich ändere oben.

Grüße
rubberman

PS:
Zitat von Friemler:
eigentlich ist es egal.
d'accord
Bitte warten ..
Mitglied: Friemler
08.07.2011 um 22:17 Uhr
Hallo rubberman,

Zitat von rubberman:
ByVal ist die bessere Variante, da auch eine Hilfsvariable global vordefiniert sein könnte und somit verändert würde.

wenn die Hilfsvariable mit einer DIM-Anweisung lokal deklariert wird, kann ruhig eine gleichnamige globale Variable vorhanden sein.

Bei der Übergabe mit ByVal muss ja der ganze Stringinhalt beim Aufruf auf den Stack geschaufelt werden. Nicht so performant.
[EDIT]
Bei einer lokalen Hilfsvariable wird der Inhalt von strPattern bei der Zuweisung auch auf den Stack geschaufelt, eigentlich ist es egal.
[/EDIT]

Gruß
Friemler
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Entwicklung
gelöst Get ip from external txt file and use in vbscript (5)

Frage von thankusomuch zum Thema Entwicklung ...

VB for Applications
gelöst Vbscript bestimmte Zeile ungeachtet der Nummerierung löschen (4)

Frage von aletri zum Thema VB for Applications ...

JavaScript
If Funktion mit wildcards in google sheets script (3)

Frage von Stoffn zum Thema JavaScript ...

Visual Studio
gelöst Vb.net Pfadangabe mit Wildcards wie Stern Regex Pattern (2)

Frage von Pilger83 zum Thema Visual Studio ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...