Dateien nach "Text" durchsuchen und Pfad ausgeben
Hallo,
ich suche dringend ein kleines VBScript.
Das Script soll einen bestimmt Text in Dateien suchen, den der Benutzer per Eingabefeld angibt.
Zudem soll der Benutzer angeben, in welchem Pfad die Suche stattfinden soll.
(Schön wäre es, wenn man dazu ein CommonDialog verwenden könnte, Beispiel unten aber falsch!)
Das Script soll dann ALLE Dateien nach diesem Suchstring durchsuchen, in dem angegebenen Ordner + Unterordner.
Das Ergebnis soll dann den Pfad + Dateinamen liefern, bestenfalls als Liste zum markieren & kopieren, notfalls als TXT-File.
Vielen Dank vorab"
ich suche dringend ein kleines VBScript.
Das Script soll einen bestimmt Text in Dateien suchen, den der Benutzer per Eingabefeld angibt.
Zudem soll der Benutzer angeben, in welchem Pfad die Suche stattfinden soll.
(Schön wäre es, wenn man dazu ein CommonDialog verwenden könnte, Beispiel unten aber falsch!)
Das Script soll dann ALLE Dateien nach diesem Suchstring durchsuchen, in dem angegebenen Ordner + Unterordner.
Das Ergebnis soll dann den Pfad + Dateinamen liefern, bestenfalls als Liste zum markieren & kopieren, notfalls als TXT-File.
Dim Pfadangabe
Dim Suchbegriff
Pfadangabe= InputBox("Bitte Verzeichnis für Suche angeben:", "Verzeichnis für Suche", "C:\TEMP")
Suchbegriff = InputBox("Bitte Suchbegriff eingeben:", "Suchbegriff eingeben", "mein Suchbegriff ")
Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = "VBScript Scripts|*.vbs|All Files|*.*" 'Filter einstellen
objDialog.Flags = &H0200 'Multi Select Flag
objDialog.FilterIndex = 1 'der erste Filter wird als erstes angezeigt
objDialog.InitialDir = "C:\Scripts" 'startfolder zum browsen
intResult = objDialog.ShowOpen 'den dialog öffnen
found = false
If found = true Then
... Suchergebnisse ...
Else
MsgBox "Suchbegriff wurde nicht gefunden!"
End If
Vielen Dank vorab"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 302247
Url: https://administrator.de/contentid/302247
Ausgedruckt am: 22.11.2024 um 22:11 Uhr
32 Kommentare
Neuester Kommentar
Powershell Einzeiler:
Fertsch.
Zu VBS haben wir dazu doch schon hunderte Einträge ...z.B.
Mithilfe eines Makros mehrere Excel-Datein nach einem Begriff durchsuchen und Daten kopieren
Gruß jodel32
select-string (read-host "Pfad und FIlter eingeben") -Pattern (read-host "Suchbegriff eingeben") -SimpleMatch
Zu VBS haben wir dazu doch schon hunderte Einträge ...z.B.
Mithilfe eines Makros mehrere Excel-Datein nach einem Begriff durchsuchen und Daten kopieren
Gruß jodel32
Naja simple For-Schleife die jedes File öffnet und darin mit InStr sucht (zur Rekursiven Suche in allen Unterordnern siehe weiter unten ....)
Das kannst du von mir aus ausschmücken wie du willst. Einen Folder-Browser-Dialog bekommst du z.B. hiermit
Zur rekursiven Suche von Dateien in Ordnern + Unterordnern gibts hier auch schon etliche Threads wie man das mit einer Rekrusiven Funktion macht ...
Datei auf Festplatte per VBA suchen und löschen ( access 2010)
Also alles schon da gewesen ... Damit hast du das Handwerkszeug es dir zusammen zu stellen. Wenn wir dir hier jetzt was fertiges vorbeten lernst du ja nichts daraus.
Gruß jodel32
Set fso = CreateObject("Scripting.FileSystemObject")
for each file in fso.GetFolder("C:\Ordner").Files
if LCase(fso.GetExtensionName(file.Name)) = "txt" then
if Instr(1,fso.OpenTextFile(file.Path,1).ReadAll(),"SUCHBEGRIFF",1) > 0 then
Msgbox "Suchbegriff gefunden in:" & file.Path
end if
End if
Next
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0,"Ordner wählen",0)
If Not objFolder Is Nothing Then
If objFolder.Self.Path <> "" Then
MsgBox objFolder.Self.Path
End If
End If
Datei auf Festplatte per VBA suchen und löschen ( access 2010)
Also alles schon da gewesen ... Damit hast du das Handwerkszeug es dir zusammen zu stellen. Wenn wir dir hier jetzt was fertiges vorbeten lernst du ja nichts daraus.
Gruß jodel32
Wenn man nur die Hälfte des Codes von oben übernimmt und das wichtigste davon weglässt, kein Wunder...
Was hast du von
nicht verstanden? Und die IF-Abfragen wegzulassen ist auch nicht gerade klug, führt es doch zu einer Exception wenn der User auf Abbrechen im Dialog klickt ...
Was hast du von
objFolder.Self.Path
Falls dir eine Batch-Lösung in den Kram passt:
@echo off
:start
SET /P "searchfor=Wonach soll gesucht werden? "
SET /P "location=Wo soll gesucht werden? (Bsp.: C:\tmp\) "
SET /P "output=Speicherort für Ergebnis? (Bsp.: C:\tmp\ergebnis.txt) "
SET /P "files=Welchen Dateitypen? (Bsp.: *.txt oder *.*) "
SET "search=%location%%files%"
:rek
SET /P "rekursiv=Soll rekursiv gesucht werden? (j/n) "
:conf
echo.
echo Suche nach: %searchfor%
echo Suche in: %location%
echo Dateien: %files%
echo Ausgabe in: %output%
echo Rekursiv: %rekursiv%
echo.
>%output% (
echo Suche nach: %searchfor%
echo Suche in: %location%
echo Dateien: %files%
echo Ausgabe in: %output%
echo Rekursiv: %rekursiv%
echo.
)
if "%rekursiv%"=="j" goto rekursiv
if "%rekursiv%"=="J" goto rekursiv
if "%rekursiv%"=="n" goto nonrekursiv
if "%rekursiv%"=="N" goto nonrekursiv
goto rek
:nonrekursiv
findstr /m "%searchfor%" %search% >>%output%
goto end
:rekursiv
findstr /s /m "%searchfor%" %search% >>%output%
goto end
:end
start %output%
Jetzt kommt gleich: "Batch haben sie uns auch deaktiviert " Wohl ein Azubi der hier fertige Skripte abgreifen will
Och, ich hatte zu meiner Azubi-Zeit auch einen Russen mit 60 Jahren auf dem Buckel in der Berufsschule ... man lernt ja nie aus
[OT]
Menno.....
Ich sach' ja nich', dass ihr diese hilfreichen und liebenswerten Randbemerkungen unterdrücken oder gar hinunterschlucken sollt...
Aber macht sie doch bitte mit [OT]-Tags kenntlich.
Gerade Frischlinge können dann besser damit umgehen. Auch die über 60.
Danke euch
Biber
[/OT]
Menno.....
Zitat von @114757:
Och, ich hatte zu meiner Azubi-Zeit auch einen Russen mit 60 Jahren auf dem Buckel in der Berufsschule ... man lernt ja nie aus
Und ich hatte auch vor 60 Jahren einen Russen mit einem Buckel bei mir in der Berufsschule...Och, ich hatte zu meiner Azubi-Zeit auch einen Russen mit 60 Jahren auf dem Buckel in der Berufsschule ... man lernt ja nie aus
Ich sach' ja nich', dass ihr diese hilfreichen und liebenswerten Randbemerkungen unterdrücken oder gar hinunterschlucken sollt...
Aber macht sie doch bitte mit [OT]-Tags kenntlich.
Gerade Frischlinge können dann besser damit umgehen. Auch die über 60.
Danke euch
Biber
[/OT]
[OT]
Biber hat mal wieder zu viel Single Malt intus und das mitten am Tag , tse, tse, tse ...
[/OT]
Biber hat mal wieder zu viel Single Malt intus und das mitten am Tag , tse, tse, tse ...
[/OT]
für einen Azubi verdiene ich als Chef viel zu viel Geld.
Und sich noch nicht mal davon einen Programmierer leistet sondern in Foren betteln muss
Also meine Batch-Lösung funktioniert...
Da könnte man ggf. Batch und VBS kombinieren (z.B. wie hier), um über die grafische Oberfläche (objShell.BrowseForFolder) einen Ordner auszuwählen oder auch andere Parameter über VBS zu setzen.
Da könnte man ggf. Batch und VBS kombinieren (z.B. wie hier), um über die grafische Oberfläche (objShell.BrowseForFolder) einen Ordner auszuwählen oder auch andere Parameter über VBS zu setzen.
Nö mittendrin ...
Funktioniert tadellos, und tschüss ....
Option Explicit
Dim strExtension, fso, objShell, strStartFolder, strSearch, colFiles, objFolder
'========Variablen für Anpassung =======
' Extension der Dateien die durchsucht werden sollen
strExtension = "txt"
'Auch Dateien in Unterordnern bearbeiten
Const RECURSION = True
'=======================================
Set fso = CreateObject("Scripting.Filesystemobject")
Set objShell = CreateObject("Shell.Application")
Set colFiles = CreateObject("Scripting.Dictionary")
Set objFolder = objShell.BrowseForFolder(0,"Verzeichnis für die Suche wählen",0)
If Not objFolder Is Nothing Then
If objFolder.Self.Path <> "" Then
strStartFolder = objFolder.Self.Path
End If
Else
WScript.Quit
End If
strSearch = InputBox("Suchbegriff eingeben","Suchbegriff")
SearchFiles colFiles, fso.GetFolder(strStartFolder), strExtension,strSearch, RECURSION
If colFiles.Count > 0 Then
' Ausgabe der gefundenen Dateien
MsgBox "Folgende Dateien enthalten den Suchhbegriff:" & vbNewLine & vbNewLine & Join(colFiles.Items,vbNewLine),vbInformation
Else
MsgBox "Suchbegriff wurde in keiner Datei gefunden",vbExclamation
End If
'Funktion um in Dateien rekursiv zu suchen
Function SearchFiles(colFiles , strFldr, strFilter, strSearch, boolRecursion)
On Error Resume Next
Dim file,content, subfolder
For Each file In strFldr.files
If LCase(fso.GetExtensionName(file.Name)) = strFilter Then
content = fso.OpenTextFile(file.Path,1,False,-2).ReadAll()
If InStr(1,content,strSearch,1) > 0 Then
colFiles.Add file.Path,file.Path
End If
End If
Next
If boolRecursion Then
For Each subFolder In strFldr.SubFolders
SearchFiles colFiles, subFolder, strFilter, strSearch, True
Next
End If
End Function
joa, , nee von Geld aus dubiosen Quellen lass ich mal lieber die Finger
Ja, alles machbar, wobei ich das persönlich eher mit Powershell machen würde, da lässt sich sowas zu einem Einzeiler zusammenschrumpfen wenn man das wollte und Probleme mit File-Encodings hast du da auch so gut wie keine.
Hast du jetzt immer noch nicht genug musst du Scheinchen abdrücken...
Gruß jodel32
$extensions = @('*.txt','*.m01','*.m02','*.m03')
Add-Type -AssemblyName Microsoft.VisualBasic
$folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$search = [Microsoft.VisualBasic.Interaction]::InputBox("Bitte Suchstring eingeben")
if ($folderBrowser.ShowDialog() -ne 0 -or $result -eq ""){
[Microsoft.VisualBasic.Interaction]::Msgbox("Nicht alle nötigen Angaben gemacht oder Angaben leer",48,"Abbruch")
return
}
$result = gci $folderBrowser.SelectedPath -Include $extensions -recurse | ?{!$_.PSIsContainer -and (gc $_.Fullname) -match [regex]::Escape($search)} | select Fullname,LastWriteTime
if($result){
$result | ogv
}else{
[Microsoft.VisualBasic.Interaction]::Msgbox("Keine Dateien mit dem Suchstring: '$search' gefunden!",48,"Kein Ergebnis")
}
Gruß jodel32
Hallo zusammen,
oder man baut sich direkt einen ganzen Dialog mit Powershell dafür zusammen:
Sieht dann z.B. so aus:
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Tags: Powershell,Dialog,Dateiinhalt durchsuchen
oder man baut sich direkt einen ganzen Dialog mit Powershell dafür zusammen:
Sieht dann z.B. so aus:
$showWindowAsync = Add-Type –memberDefinition @”
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru
function Hide-PowerShell() {
[void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 2)
}
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("Microsoft.VisualBasic") | Out-Null
#endregion
#region Generated Form Objects
$form_main = New-Object System.Windows.Forms.Form
$txtExtensions = New-Object System.Windows.Forms.TextBox
$label3 = New-Object System.Windows.Forms.Label
$btnSearch = New-Object System.Windows.Forms.Button
$dgv = New-Object System.Windows.Forms.DataGridView
$textBox1 = New-Object System.Windows.Forms.TextBox
$label2 = New-Object System.Windows.Forms.Label
$lblFolder = New-Object System.Windows.Forms.Label
$btnChooseFolder = New-Object System.Windows.Forms.Button
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
#----------------------------------------------
# Event Script Blocks
#----------------------------------------------
$handler_btnSearch_Click=
{
$arrExtensions = $txtExtensions.Text.split(',')
$result = gci $lblFolder.Text -Include $arrExtensions -recurse -Force | ?{!$_.PSIsContainer -and (gc -LiteralPath $_.Fullname) -match [regex]::Escape($textbox1.Text)} | select Fullname,LastWriteTime
if($result){
$arrList = New-Object System.Collections.ArrayList
$arrList.AddRange(@($result))
$dgv.DataSource = $arrList
}else{
$dgv.DataSource = $null
[Microsoft.VisualBasic.Interaction]::Msgbox("Keine Dateien mit dem Suchstring: '$search' gefunden!",48,"Kein Ergebnis")
}
}
$handler_btnChooseFolder_Click=
{
$folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
if ($folderBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK -and (Test-Path $folderBrowser.SelectedPath)){
$lblFolder.Text = $folderBrowser.SelectedPath
$btnSearch.Enabled = $true
}
}
$handler_dgv_doubleclick = {
if ($dgv.SelectedRows.Count -ne -1){
Start-Process $dgv.SelectedRows.Cells.Value
}
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form_main.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 253
$System_Drawing_Size.Width = 324
$form_main.ClientSize = $System_Drawing_Size
$form_main.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 281
$System_Drawing_Size.Width = 332
$form_main.MinimumSize = $System_Drawing_Size
$form_main.Name = "form_main"
$form_main.Text = "Dateien durchsuchen"
$txtExtensions.Anchor = 13
$txtExtensions.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 89
$System_Drawing_Point.Y = 72
$txtExtensions.Location = $System_Drawing_Point
$txtExtensions.Name = "txtExtensions"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 142
$txtExtensions.Size = $System_Drawing_Size
$txtExtensions.TabIndex = 7
$txtExtensions.Text = '*.txt,*.m01,*.m02,*.m03'
$form_main.Controls.Add($txtExtensions)
$label3.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 75
$label3.Location = $System_Drawing_Point
$label3.Name = "label3"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 78
$label3.Size = $System_Drawing_Size
$label3.TabIndex = 6
$label3.Text = "Erweiterungen:"
$form_main.Controls.Add($label3)
$btnSearch.Anchor = 9
$btnSearch.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 237
$System_Drawing_Point.Y = 69
$btnSearch.Location = $System_Drawing_Point
$btnSearch.Name = "btnSearch"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$btnSearch.Size = $System_Drawing_Size
$btnSearch.TabIndex = 5
$btnSearch.Text = "Suchen"
$btnSearch.Enabled = $false
$btnSearch.UseVisualStyleBackColor = $True
$btnSearch.add_Click($handler_btnSearch_Click)
$form_main.Controls.Add($btnSearch)
$dgv.Anchor = 15
$dgv.AutoSizeColumnsMode = 16
$dgv.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 101
$dgv.Location = $System_Drawing_Point
$dgv.Name = "dgv"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 140
$System_Drawing_Size.Width = 300
$dgv.Size = $System_Drawing_Size
$dgv.TabIndex = 4
$dgv.ReadOnly = $true
$dgv.MultiSelect = $false
$dgv.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect
$dgv.add_CellContentDoubleClick($handler_dgv_doubleclick)
$form_main.Controls.Add($dgv)
$textBox1.Anchor = 13
$textBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 89
$System_Drawing_Point.Y = 43
$textBox1.Location = $System_Drawing_Point
$textBox1.Name = "textBox1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 223
$textBox1.Size = $System_Drawing_Size
$textBox1.TabIndex = 3
$textbox1.Text = "Suchbegriff"
$form_main.Controls.Add($textBox1)
$label2.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 46
$label2.Location = $System_Drawing_Point
$label2.Name = "label2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 71
$label2.Size = $System_Drawing_Size
$label2.TabIndex = 2
$label2.Text = "Suchbegriff:"
$form_main.Controls.Add($label2)
$lblFolder.Anchor = 13
$lblFolder.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 124
$System_Drawing_Point.Y = 17
$lblFolder.Location = $System_Drawing_Point
$lblFolder.Name = "lblFolder"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 188
$lblFolder.Size = $System_Drawing_Size
$lblFolder.TabIndex = 1
$lblFolder.Text = ""
$lblFolder.AutoSize = $true
$form_main.Controls.Add($lblFolder)
$btnChooseFolder.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$btnChooseFolder.Location = $System_Drawing_Point
$btnChooseFolder.Name = "btnChooseFolder"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 106
$btnChooseFolder.Size = $System_Drawing_Size
$btnChooseFolder.TabIndex = 0
$btnChooseFolder.Text = "Ordner wählen ..."
$btnChooseFolder.UseVisualStyleBackColor = $True
$btnChooseFolder.add_Click($handler_btnChooseFolder_Click)
$form_main.Controls.Add($btnChooseFolder)
#Save the initial state of the form
$InitialFormWindowState = $form_main.WindowState
#Init the OnLoad event to correct the initial state of the form
$form_main.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form_main.ShowDialog()| Out-Null
} #End Function
Hide-Powershell
GenerateForm
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Tags: Powershell,Dialog,Dateiinhalt durchsuchen
[OT]
Moin jobel32, moin colinardo,
geht mich ja nix an, aber wenn doch der TO schreibt...
... dann heisst doch "nicht umsonst nach einer VBS Lösung" im Umkehrschluss wohl nicht automatisch "gegen Kohle nach einer PowerShell-Lösung".
Außerdem... ihr müsst doch nicht gleich mit Kanonen auf die Spätzle schiessen oder mit Perlen auf die Säue werfen oder wie das heisst.
Grüße
Biber
[/OT]
Moin jobel32, moin colinardo,
geht mich ja nix an, aber wenn doch der TO schreibt...
... dann heisst doch "nicht umsonst nach einer VBS Lösung" im Umkehrschluss wohl nicht automatisch "gegen Kohle nach einer PowerShell-Lösung".
Außerdem... ihr müsst doch nicht gleich mit Kanonen auf die Spätzle schiessen oder mit Perlen auf die Säue werfen oder wie das heisst.
Grüße
Biber
[/OT]
Hallo Biber.
Uups doch glatt überlesen, Schande über mein Haupt
Naja, anderen "Chefs" denen nicht vorgeschrieben wird welche Skriptsprache sie zu nutzen haben und die hier vorbeistöbern wird es sicherlich helfen
Grüße Uwe
Uups doch glatt überlesen, Schande über mein Haupt
Naja, anderen "Chefs" denen nicht vorgeschrieben wird welche Skriptsprache sie zu nutzen haben und die hier vorbeistöbern wird es sicherlich helfen
Grüße Uwe