Нужна помощь в изменении скрипта - PullRequest
0 голосов
/ 06 июня 2018

Мне нужна помощь, чтобы изменить скрипт Hackoo, который я нашел по этой ссылке.

командный файл, который ищет строки в текстовом файле во всех файлах в папках / подпапках

Сценарий хорош, но в журнале вместо текста поиска он выводит числа в скобках.

Например, я ищу текст "My_Cat", который находится в файлеtextlist.txt.Сценарий обнаружил файл, в котором было «My_Cat», но после окончания поиска он выдает номер в скобках вместо «My_Cat».При создании журнала тоже самое.В самом деле?Номер ищет в тексте?0_0

Короче говоря, мне нужно вместо этого, чтобы "[1] - Test_Dog.xml -" D: \ Files \ Test_Dog.xml ", чтобы это было" [My_Cat] - Test_Dog - "D: \файлы \ Test_Dog.xml "

1 Ответ

0 голосов
/ 07 июня 2018
; AutoIt Version:   3.3.10.2 or later.
; Author:           Michael Heath
; Script Function:  Searches files for strings in recursive mode using findstr.

#pragma compile(Out, 'searcher.exe')
#pragma compile(FileVersion, 3.3.10.2)
#pragma compile(ProductVersion, 1.1.0.0)
#pragma compile(FileDescription, 'Searcher')
#pragma compile(ProductName, 'Searcher')
#pragma compile(Console, False)

#region - Generated Constants
; If Std includes added cause error with these,
; then remove any of these constants to fix.
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_CHECKED = 1
Global Const $GUI_UNCHECKED = 4
Global Const $GUI_ENABLE = 64
Global Const $GUI_DISABLE = 128
#endregion

; Get the search executable for main use.
$sSearchExe = _Get_SearchExe()

#region - CmdlineSwitch
If $CMDLINE[0] Then
    ; Patterns file
    $sStringsFile = ''
    ; i.e *.txt
    $sFilePatterns = ''
    ; Directory to search from.
    $sSearchPath = ''
    ; Output with filenames and search strings.
    $bWithNoStrings = False

    For $i = 1 To $CMDLINE[0]
        Switch $CMDLINE[$i]
            Case '/?'
                MsgBox(0x40000, 'Searcher Help', _
                 'Searches files for strings in recursive mode using findstr.' & @CRLF & @CRLF & _
                 'Syntax: ' & @ScriptName & ' search_path patternfile filepattern [[filepattern] ... ] [/m]' & @CRLF & _
                 @CRLF & _
                 'Arguments are:' & @CRLF _
                 & @CRLF & 'search_path' _
                 & @CRLF & @TAB & 'Directory path to search from.' _
                 & @CRLF & 'patternfile' _
                 & @CRLF & @TAB & 'Gets search strings from the specified file.' _
                 & @CRLF & 'filepattern' _
                 & @CRLF & @TAB & 'File to search for i.e. *.txt.' _
                 & @CRLF & '/m' _
                 & @CRLF & @TAB & 'Output files and no strings.' _
                 & @CRLF & @TAB & 'Only works with findstr.' _
                 & @CRLF & @CRLF & _
                 'No arguments passed shows the Gui.' & @CRLF & @CRLF & _
                 'Arguments passed may require a command to get stdout i.e a CMD for loop. ' & _
                 'Or pipe to more i.e. command|more. If compiled as console then ' & _
                 'getting the stdout should be like using a console executable.' & @CRLF & @CRLF & _
                 'An ini file can be used named "searcher.ini" in the program directory i.e.' & @CRLF & @CRLF & _
                 ' [main]' & @CRLF & _
                 ' SearchExe=findstr' & @CRLF & @CRLF & _
                 'You can use "SearchExe=strings" or "SearchExe=strings64" ' & _
                 'which are available from Windows Sysinternals.' _
                )
                Exit

            Case Else
                If $CMDLINE[$i] == '/m' Then
                    $bWithNoStrings = True
                ElseIf $sSearchPath == '' Then
                    $sSearchPath = $CMDLINE[$i]
                ElseIf $sStringsFile == '' Then
                    $sStringsFile = $CMDLINE[$i]
                Else
                    $sFilePatterns &= '"' & $CMDLINE[$i] & '" '
                EndIf
        EndSwitch
    Next

    $sFilePatterns = StringTrimRight($sFilePatterns, 1)

    If $sFilePatterns == '' Or $sSearchPath == '' Or $sStringsFile == '' Then
        ConsoleWriteError('Incorrect arguments passed' & @CRLF)
        Exit 1
    EndIf

    $sStdout = _Run_Search($sFilePatterns, $sSearchPath, $sStringsFile, $bWithNoStrings)

    ; Trim ends of whitespace and output to stdout.
    $sStdout = StringStripWS($sStdout, 3)
    ConsoleWrite($sStdout & @CRLF)
    Exit
EndIf
#endregion

$iMainGui = GUICreate('Searcher', 640, 580)
GUICtrlCreateLabel('Path to search', 10, 10)
$iSearchPath = GUICtrlCreateInput('', 10, 30, 500)
GUICtrlCreateLabel('File patterns', 10, 60)
$iFilePatterns = GUICtrlCreateInput('', 10, 80, 500)
GUICtrlCreateLabel('Strings to find', 10, 110)
$iSearchStrings = GUICtrlCreateEdit('', 10, 130, 500, 200)
GUICtrlCreateLabel('Result', 10, 340)
$iResult = GUICtrlCreateEdit('', 10, 360, 500, 200)
$iButtonSearchPath = GUICtrlCreateButton('...', 520, 27, 25)
$iButtonFilePattern = GUICtrlCreateButton('...', 520, 130, 25)
$iComboSearchExe = GUICtrlCreateCombo('', 520, 360, 100, Default, 0x3); $CBS_DROPDOWNLIST
GUICtrlSetData($iComboSearchExe, _Get_SearchExe(True), $sSearchExe)
$iCheckboxWithStrings = GUICtrlCreateCheckbox('Output no strings', 520, 460)
If $sSearchExe <> 'findstr' Then
    GUICtrlSetState($iCheckboxWithStrings, $GUI_DISABLE)
EndIf
$iButtonSearch = GUICtrlCreateButton('Search', 520, 500, 100, 60)
GUISetState()

GUICtrlSetTip($iFilePatterns, 'i.e. *.txt')
GUICtrlSetTip($iButtonFilePattern, 'Select pattern file to read')
GUICtrlSetTip($iButtonSearchPath, 'Select folder to search')
GUICtrlSetTip($iComboSearchExe, 'Select main search executable')

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit

        Case $iButtonFilePattern
            ; Backup current workdir as FileOpenDialog changes it.
            $sSaveDir = @WorkingDir

            ; Dialog option 1 = File must exist.
            $sSelectedFile = FileOpenDialog('Pattern file containing search strings', _
             '', 'Text files (*.txt)|All files (*.*)', 1, '', $iMainGui _
            )

            If @error Then ContinueLoop
            GUICtrlSetData($iSearchStrings, FileRead($sSelectedFile))
            FileChangeDir($sSaveDir)

        Case $iButtonSearch
            ; Read ctrls and trim ends of whitespace.
            $sFilePatterns = StringStripWS(GUICtrlRead($iFilePatterns), 3)
            $sSearchPath = StringStripWS(GUICtrlRead($iSearchPath), 3)
            $sSearchStrings = StringStripWS(GUICtrlRead($iSearchStrings), 3)

            If $sFilePatterns == '' Then ContinueLoop
            If $sSearchPath == '' Then ContinueLoop
            If $sSearchStrings == '' Then ContinueLoop

            $sStringsFile = _Save_PatternFile($sSearchStrings)
            If @error Then
                MsgBox(0x30, @ScriptName, 'Write temp patterns file error', 0, $iMainGui)
                ContinueLoop
            EndIf

            If GUICtrlRead($iCheckboxWithStrings) = $GUI_CHECKED Then
                $bWithNoStrings = True
            Else
                $bWithNoStrings = False
            EndIf

            $sStdout = _Run_Search($sFilePatterns, $sSearchPath, $sStringsFile, $bWithNoStrings)

            GUICtrlSetData($iResult, $sStdout)

        Case $iButtonSearchPath
            $sSelectedDir = FileSelectFolder('Choose search directory.', _
             '', 0, '', $iMainGui _
            )

            If @error Then ContinueLoop
            GUICtrlSetData($iSearchPath, $sSelectedDir)

        Case $iComboSearchExe
            $sSearchExe = GUICtrlRead($iComboSearchExe)

            Switch $sSearchExe
                Case 'findstr'
                    GUICtrlSetState($iCheckboxWithStrings, $GUI_ENABLE)

                Case Else
                    GUICtrlSetState($iCheckboxWithStrings, $GUI_UNCHECKED)
                    GUICtrlSetState($iCheckboxWithStrings, $GUI_DISABLE)
            EndSwitch
    EndSwitch
WEnd

Exit


Func _Get_SearchExe($bGetComboString = False)
    Local $sComboString, $sSearchExe

    ; Vaild entries to select from.
    If @OSArch = 'X86' Then
        Local $aSearchExe[] = ['findstr', 'strings']
    Else
        Local $aSearchExe[] = ['findstr', 'strings', 'strings64']
    EndIf

    If $bGetComboString Then
        For $sItem in $aSearchExe
            $sComboString &= $sItem & '|'
        Next

        $sComboString = StringTrimRight($sComboString, 1)

        Return $sComboString
    EndIf

    $sSearchExe = IniRead(@ScriptDir & '\searcher.ini', 'Main', 'SearchExe', 'findstr')

    ; Trim .exe from right side.
    If StringRegExp($sSearchExe, '(?i).exe\Z') Then
        $sSearchExe = StringTrimRight($sSearchExe, 4)
    EndIf

    ; Return valid search exe.
    For $sItem in $aSearchExe
        If $sSearchExe = $sItem Then Return $sSearchExe
    Next

    ; Else return default search exe.
    Return 'findstr'
EndFunc


Func _Save_PatternFile($sSearchStrings)
    Local $hWrite, $sStringsFile

    ; Get unique filename for patterns file.
    $sStringsFile = @TempDir & '\searcher1000.tmp'

    For $i1 = 1000 To 10000
        If Not FileExists(@TempDir & '\searcher' & $i1 & '.tmp') Then
            $sStringsFile = @TempDir & '\searcher' & $i1 & '.tmp'
            ExitLoop
        EndIf
    Next

    ; Write file for findstr to get strings from using utf-8 and erase mode.
    $hWrite = FileOpen($sStringsFile, 0x102)
    If $hWrite = -1 Then Return SetError(1, 0, '')
    FileWrite($hWrite, $sSearchStrings & @CRLF)
    FileClose($hWrite)

    Return $sStringsFile
EndFunc


Func _Run_Search($sFilePatterns, $sSearchPath, $sStringsFile = @TempDir & '\searcher1000.tmp', $bWithNoStrings = False)
    Local $iPid, $sCommand, $sStdout
    Dim $sSearchExe

    If Not $sSearchExe Then $sSearchExe = 'findstr'

    ; Build command.
    If StringLeft($sSearchExe, 7) = 'strings' Then
        $sCommand = 'cmd /c ' & $sSearchExe & ' -nobanner -s ' & $sFilePatterns & _
         '|' & 'findstr /l /i /g:"' & $sStringsFile & '"'
    Else
        $sCommand = 'findstr /l /i /s '

        If $bWithNoStrings Then $sCommand &= '/m '

        $sCommand &= '/g:"' & $sStringsFile & '" ' & $sFilePatterns
    EndIf

    ; Run findstr and get stdout (opt_flag = 2).
    $iPid = Run($sCommand, $sSearchPath, @SW_HIDE, 2)

    Do
        Sleep(10)
        $sStdout &= StdoutRead($iPid)
    Until @error

    ; Cleanup tmp file.
    if StringRegExp($sStringsFile, '(?i)searcher\d{4,}\.tmp\Z') Then
        FileDelete($sStringsFile)
    EndIf

    Return $sStdout
EndFunc

Это код AutoIt v3.Он выполняет поиск рекурсивно, используя findstr.Если никакие аргументы не переданы тогда, это показывает Gui.Gui не отображается, если аргументы переданы и выводятся в stdout и stderr.

Скомпилировано и протестировано как Gui.Вероятно, он может быть скомпилирован как Cui, что может быть лучше для использования в CLI, хотя вы можете получить окно консоли, когда Gui открывается, когда аргументы не передаются.

Поддерживает аргументы CLI, поэтому его можно использовать в сценарии CMD или аналогичном.Используйте аргумент /?, чтобы увидеть окно сообщения с синтаксисом, доступными аргументами, описаниями и другой полезной информацией.

Синтаксис CLI: searcher search_path patternfile filepattern [[filepattern] ... ] [/m].

Не был создан, чтобы делать в точности так, как это делает код Hackooкак мне было лень это читать.Возможно, похожий, хотя используется другой язык, что делает его отличным в использовании.Сообщите мне, если какая-либо функция отсутствует, и я могу ее обновить.


Примечание. Я не могу перечислить все обновленные элементы.Ожидаются основные элементы.

Обновлено с помощью флажка управления и аргумента, чтобы разрешить вывод без строк.то есть filepath:found_string.Это формат, который выводит findstr.

Обновлен для использования UTF-8 без спецификации для файла шаблона, считанного findstr.

Обновлен для использования findstr, stringsили strings64.Домашняя страница строк .Поместите исполняемые файлы потока в каталог, доступный в PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...