다른 명령
autoit 폴더 내부 텍스트
- Region ;**** Directives created by AutoIt3Wrapper_GUI ****
- AutoIt3Wrapper_Icon=search.ico
- AutoIt3Wrapper_Res_Description=텍스트 파일 검색 프로그램
- AutoIt3Wrapper_Res_Fileversion=1.0.0.0
- AutoIt3Wrapper_Res_ProductVersion=1.0.0
- EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
- include <ButtonConstants.au3>
- include <EditConstants.au3>
- include <GUIConstantsEx.au3>
- include <GuiListView.au3>
- include <GuiListBox.au3>
- include <StaticConstants.au3>
- include <WindowsConstants.au3>
- include <File.au3>
- include <Array.au3>
- include <String.au3>
- include <StringConstants.au3>
- ===== 전역 변수 =====
Global $g_hGUI, $g_idFolderPath, $g_idSearchText, $g_idResultList Global $g_idBtnBrowse, $g_idBtnSearch, $g_idBtnSave, $g_idBtnClear Global $g_idChkRegex, $g_idChkCase, $g_idChkSubFolder Global $g_idCmbFileType, $g_idProgressBar, $g_idStatusBar Global $g_aResults[1][6] ; [파일경로, 상대경로, 라인번호, 라인내용, 파일크기, 수정일시] Global $g_iResultCount = 0 Global $g_sBaseFolder = ""
- 지원할 파일 확장자
Global $g_aFileTypes[11][2] = [["전체 텍스트 파일", "*.txt;*.log;*.sql;*.ini;*.cfg;*.conf;*.properties"], _
["텍스트 파일 (*.txt)", "*.txt"], _
["로그 파일 (*.log)", "*.log"], _
["SQL 파일 (*.sql)", "*.sql"], _
["설정 파일 (*.ini;*.cfg;*.conf)", "*.ini;*.cfg;*.conf"], _
["스크립트 파일 (*.py;*.js;*.vbs;*.au3)", "*.py;*.js;*.vbs;*.au3"], _
["웹 파일 (*.html;*.htm;*.xml;*.json)", "*.html;*.htm;*.xml;*.json"], _
["배치 파일 (*.bat;*.cmd;*.ps1)", "*.bat;*.cmd;*.ps1"], _
["오라클 추적 파일 (*.trc)", "*.trc"], _
["마크다운 (*.md)", "*.md"], _
["모든 파일 (*.*)", "*.*"]]
Main()
Func Main()
CreateGUI()
While 1
Local $nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $g_idBtnBrowse
BrowseFolder()
Case $g_idBtnSearch
StartSearch()
Case $g_idBtnSave
SaveResults()
Case $g_idBtnClear
ClearResults()
Case $g_idResultList
If @extended = $NM_DBLCLK Then
OpenSelectedFile()
EndIf
EndSwitch
WEnd
GUIDelete()
EndFunc
Func CreateGUI()
; 메인 윈도우 생성
$g_hGUI = GUICreate("텍스트 파일 검색 프로그램 v1.0 - Oracle DBA Tools", 900, 650, -1, -1, $WS_OVERLAPPEDWINDOW)
; 폴더 선택 그룹
GUICtrlCreateGroup("검색 경로", 10, 10, 880, 60)
GUICtrlCreateLabel("폴더:", 20, 35, 40, 20)
$g_idFolderPath = GUICtrlCreateInput("", 65, 32, 730, 23)
$g_idBtnBrowse = GUICtrlCreateButton("찾기", 805, 30, 80, 27)
GUICtrlCreateGroup("", -99, -99, 1, 1) ; 그룹 종료
; 검색 옵션 그룹
GUICtrlCreateGroup("검색 옵션", 10, 80, 880, 90)
GUICtrlCreateLabel("검색어:", 20, 105, 50, 20)
$g_idSearchText = GUICtrlCreateInput("", 75, 102, 300, 23)
GUICtrlCreateLabel("파일 형식:", 390, 105, 60, 20)
$g_idCmbFileType = GUICtrlCreateCombo("", 455, 102, 200, 200, $CBS_DROPDOWNLIST)
; 파일 형식 콤보박스 채우기
Local $sFileTypes = ""
For $i = 0 To UBound($g_aFileTypes) - 1
$sFileTypes &= $g_aFileTypes[$i][0]
If $i < UBound($g_aFileTypes) - 1 Then $sFileTypes &= "|"
Next
GUICtrlSetData($g_idCmbFileType, $sFileTypes, $g_aFileTypes[0][0])
$g_idBtnSearch = GUICtrlCreateButton("검색 시작", 680, 100, 100, 27)
$g_idBtnClear = GUICtrlCreateButton("결과 지우기", 790, 100, 90, 27)
; 체크박스 옵션들
$g_idChkCase = GUICtrlCreateCheckbox("대소문자 구분", 20, 135, 100, 20)
$g_idChkRegex = GUICtrlCreateCheckbox("정규식 사용", 130, 135, 100, 20)
$g_idChkSubFolder = GUICtrlCreateCheckbox("하위 폴더 포함", 240, 135, 100, 20)
GUICtrlSetState($g_idChkSubFolder, $GUI_CHECKED) ; 기본적으로 체크
GUICtrlCreateGroup("", -99, -99, 1, 1) ; 그룹 종료
; 결과 리스트뷰
GUICtrlCreateGroup("검색 결과", 10, 180, 880, 400)
$g_idResultList = GUICtrlCreateListView("파일명|상대 경로|라인|내용|크기|수정일시", 20, 200, 860, 350, $LVS_REPORT + $LVS_SHOWSELALWAYS)
_GUICtrlListView_SetColumnWidth($g_idResultList, 0, 150) ; 파일명
_GUICtrlListView_SetColumnWidth($g_idResultList, 1, 250) ; 상대경로
_GUICtrlListView_SetColumnWidth($g_idResultList, 2, 50) ; 라인
_GUICtrlListView_SetColumnWidth($g_idResultList, 3, 300) ; 내용
_GUICtrlListView_SetColumnWidth($g_idResultList, 4, 70) ; 크기
_GUICtrlListView_SetColumnWidth($g_idResultList, 5, 120) ; 수정일시
GUICtrlCreateGroup("", -99, -99, 1, 1) ; 그룹 종료
; 하단 버튼들
$g_idBtnSave = GUICtrlCreateButton("결과 저장", 20, 590, 100, 30)
GUICtrlCreateButton("도움말", 130, 590, 80, 30)
; 상태바
$g_idStatusBar = GUICtrlCreateLabel("준비됨", 20, 630, 860, 15)
GUISetState(@SW_SHOW)
EndFunc
Func BrowseFolder()
Local $sFolder = FileSelectFolder("검색할 폴더를 선택하세요", "", 1)
If $sFolder <> "" Then
GUICtrlSetData($g_idFolderPath, $sFolder)
$g_sBaseFolder = $sFolder
EndIf
EndFunc
Func StartSearch()
Local $sFolder = GUICtrlRead($g_idFolderPath)
Local $sSearchText = GUICtrlRead($g_idSearchText)
; 입력값 검증
If $sFolder = "" Then
MsgBox(16, "오류", "검색할 폴더를 선택해주세요.")
Return
EndIf
If Not FileExists($sFolder) Then
MsgBox(16, "오류", "선택한 폴더가 존재하지 않습니다.")
Return
EndIf
If $sSearchText = "" Then
MsgBox(16, "오류", "검색어를 입력해주세요.")
Return
EndIf
; 검색 옵션 읽기
Local $bCaseSensitive = (GUICtrlRead($g_idChkCase) = $GUI_CHECKED)
Local $bUseRegex = (GUICtrlRead($g_idChkRegex) = $GUI_CHECKED)
Local $bIncludeSubFolder = (GUICtrlRead($g_idChkSubFolder) = $GUI_CHECKED)
Local $iFileTypeIndex = _GUICtrlComboBox_GetCurSel($g_idCmbFileType)
Local $sFilePattern = $g_aFileTypes[$iFileTypeIndex][1]
; 결과 초기화
ClearResults()
; 검색 시작
GUICtrlSetData($g_idStatusBar, "검색 중...")
GUICtrlSetState($g_idBtnSearch, $GUI_DISABLE)
$g_sBaseFolder = $sFolder
SearchInFolder($sFolder, $sSearchText, $sFilePattern, $bCaseSensitive, $bUseRegex, $bIncludeSubFolder)
GUICtrlSetState($g_idBtnSearch, $GUI_ENABLE)
GUICtrlSetData($g_idStatusBar, "검색 완료: " & $g_iResultCount & "개 결과 발견")
If $g_iResultCount = 0 Then
MsgBox(64, "검색 완료", "검색 결과가 없습니다.")
Else
MsgBox(64, "검색 완료", $g_iResultCount & "개의 결과를 찾았습니다.")
EndIf
EndFunc
Func SearchInFolder($sFolder, $sSearchText, $sFilePattern, $bCaseSensitive, $bUseRegex, $bIncludeSubFolder)
Local $aFiles, $aFileList
Local $sSearchPattern = $bIncludeSubFolder ? "*" : ""
; 파일 패턴을 배열로 분할
Local $aPatterns = StringSplit($sFilePattern, ";", $STR_NOCOUNT)
For $sPattern In $aPatterns
If $bIncludeSubFolder Then
$aFiles = _FileListToArrayRec($sFolder, $sPattern, $FLTAR_FILES, $FLTAR_RECUR)
Else
$aFiles = _FileListToArray($sFolder, $sPattern, $FLTAR_FILES)
EndIf
If Not @error And IsArray($aFiles) Then
For $i = 1 To $aFiles[0]
Local $sFilePath = $bIncludeSubFolder ? $aFiles[$i] : $sFolder & "\" & $aFiles[$i]
SearchInFile($sFilePath, $sSearchText, $bCaseSensitive, $bUseRegex)
; 상태 업데이트 (너무 자주 하지 않도록)
If Mod($i, 50) = 0 Then
GUICtrlSetData($g_idStatusBar, "검색 중... (" & $i & "/" & $aFiles[0] & " 파일)")
EndIf
Next
EndIf
Next
EndFunc
Func SearchInFile($sFilePath, $sSearchText, $bCaseSensitive, $bUseRegex)
Local $hFile = FileOpen($sFilePath, $FO_READ + $FO_UTF8_NOBOM)
If $hFile = -1 Then
; UTF-8로 실패하면 ANSI로 시도
$hFile = FileOpen($sFilePath, $FO_READ)
If $hFile = -1 Then Return
EndIf
Local $sContent = FileRead($hFile)
FileClose($hFile)
If $sContent = "" Then Return
; 줄 단위로 분할
Local $aLines = StringSplit($sContent, @CRLF, $STR_ENTIRESPLIT + $STR_NOCOUNT)
; 파일 정보 가져오기
Local $iFileSize = FileGetSize($sFilePath)
Local $sModifiedTime = FileGetTime($sFilePath, $FT_MODIFIED, $FT_STRING)
; 각 줄에서 검색
For $i = 0 To UBound($aLines) - 1
Local $sLine = $aLines[$i]
Local $bFound = False
If $bUseRegex Then
; 정규식 검색
Local $aResult = StringRegExp($sLine, $sSearchText, $STR_REGEXPARRAYMATCH)
If Not @error And IsArray($aResult) Then
$bFound = True
EndIf
Else
; 일반 텍스트 검색
Local $sSearchLine = $bCaseSensitive ? $sLine : StringLower($sLine)
Local $sSearchTerm = $bCaseSensitive ? $sSearchText : StringLower($sSearchText)
If StringInStr($sSearchLine, $sSearchTerm) > 0 Then
$bFound = True
EndIf
EndIf
If $bFound Then
AddResult($sFilePath, $i + 1, $sLine, $iFileSize, $sModifiedTime)
EndIf
Next
EndFunc
Func AddResult($sFilePath, $iLineNumber, $sLineContent, $iFileSize, $sModifiedTime)
; 결과 배열 확장
ReDim $g_aResults[$g_iResultCount + 1][6]
; 상대 경로 계산
Local $sRelativePath = StringReplace($sFilePath, $g_sBaseFolder & "\", "")
If $sRelativePath = $sFilePath Then $sRelativePath = StringReplace($sFilePath, $g_sBaseFolder, "")
; 파일명만 추출
Local $aPathParts = StringSplit($sFilePath, "\", $STR_NOCOUNT)
Local $sFileName = $aPathParts[UBound($aPathParts) - 1]
; 결과 저장
$g_aResults[$g_iResultCount][0] = $sFilePath
$g_aResults[$g_iResultCount][1] = $sRelativePath
$g_aResults[$g_iResultCount][2] = $iLineNumber
$g_aResults[$g_iResultCount][3] = StringLeft($sLineContent, 200) ; 최대 200자만
$g_aResults[$g_iResultCount][4] = Round($iFileSize / 1024, 1) & " KB"
$g_aResults[$g_iResultCount][5] = $sModifiedTime
; 리스트뷰에 추가
Local $sItem = $sFileName & "|" & $sRelativePath & "|" & $iLineNumber & "|" & _
StringReplace($sLineContent, @TAB, " ") & "|" & _
Round($iFileSize / 1024, 1) & " KB|" & $sModifiedTime
GUICtrlCreateListViewItem($sItem, $g_idResultList)
$g_iResultCount += 1
EndFunc
Func ClearResults()
; 리스트뷰 클리어 _GUICtrlListView_DeleteAllItems($g_idResultList) ; 결과 배열 초기화 ReDim $g_aResults[1][6] $g_iResultCount = 0 GUICtrlSetData($g_idStatusBar, "결과가 초기화되었습니다.")
EndFunc
Func SaveResults()
If $g_iResultCount = 0 Then
MsgBox(16, "오류", "저장할 결과가 없습니다.")
Return
EndIf
Local $sSaveFile = FileSaveDialog("검색 결과 저장", @MyDocumentsDir, "텍스트 파일 (*.txt)|모든 파일 (*.*)", $FD_PATHMUSTEXIST, "search_results.txt")
If $sSaveFile <> "" Then
Local $hFile = FileOpen($sSaveFile, $FO_OVERWRITE + $FO_CREATEPATH + $FO_UTF8_NOBOM)
If $hFile = -1 Then
MsgBox(16, "오류", "파일을 생성할 수 없습니다.")
Return
EndIf
; 헤더 정보
FileWriteLine($hFile, "=== 텍스트 파일 검색 결과 ===")
FileWriteLine($hFile, "생성일시: " & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
FileWriteLine($hFile, "검색 경로: " & $g_sBaseFolder)
FileWriteLine($hFile, "총 결과: " & $g_iResultCount & "건")
FileWriteLine($hFile, "=" & StringRepeat("=", 80))
FileWriteLine($hFile, "")
; 결과 데이터
For $i = 0 To $g_iResultCount - 1
FileWriteLine($hFile, "파일: " & $g_aResults[$i][0])
FileWriteLine($hFile, "라인: " & $g_aResults[$i][2])
FileWriteLine($hFile, "내용: " & $g_aResults[$i][3])
FileWriteLine($hFile, "크기: " & $g_aResults[$i][4])
FileWriteLine($hFile, "수정일: " & $g_aResults[$i][5])
FileWriteLine($hFile, StringRepeat("-", 80))
Next
FileClose($hFile)
MsgBox(64, "저장 완료", "검색 결과가 저장되었습니다." & @CRLF & $sSaveFile)
; 저장된 파일 열기 여부 확인
Local $iResult = MsgBox(36, "파일 열기", "저장된 파일을 열어보시겠습니까?")
If $iResult = 6 Then ; Yes
ShellExecute($sSaveFile)
EndIf
EndIf
EndFunc
Func OpenSelectedFile()
Local $iSelected = _GUICtrlListView_GetNextItem($g_idResultList)
If $iSelected >= 0 Then
Local $sFilePath = $g_aResults[$iSelected][0]
Local $iLineNumber = $g_aResults[$iSelected][2]
; 파일 열기 옵션 제공
Local $iChoice = MsgBox(35, "파일 열기", "파일을 어떻게 열까요?" & @CRLF & @CRLF & _
"예(Y): 메모장으로 열기" & @CRLF & _
"아니오(N): 기본 프로그램으로 열기" & @CRLF & _
"취소: 파일 경로 복사")
Switch $iChoice
Case 6 ; Yes - 메모장
Run("notepad.exe " & '"' & $sFilePath & '"')
Case 7 ; No - 기본 프로그램
ShellExecute($sFilePath)
Case 2 ; Cancel - 경로 복사
ClipPut($sFilePath)
MsgBox(64, "복사 완료", "파일 경로가 클립보드에 복사되었습니다.")
EndSwitch
EndIf
EndFunc
- Oracle DBA를 위한 추가 유틸리티 함수들
Func SearchOracleErrors()
; Oracle 에러 패턴들을 미리 정의
Local $aOracleErrors[5] = ["ORA-\d{5}", "TNS-\d{5}", "RMAN-\d{5}", "SP2-\d{4}", "PLS-\d{5}"]
; 콤보박스에서 Oracle 관련 파일 선택
; 구현 생략...
EndFunc
Func SearchSQLPatterns()
; 자주 사용되는 SQL 패턴들 Local $aSQLPatterns[6] = ["SELECT.*FROM", "INSERT.*INTO", "UPDATE.*SET", "DELETE.*FROM", "CREATE.*TABLE", "ALTER.*TABLE"] ; 구현 생략...
EndFunc