파일을 만들거나 편집 할 때 폴더를 모니터링하고 명령 줄 작업을 트리거하는 방법은 무엇입니까?


82

Vista 컴퓨터에서 일종의 스크립트를 설정해야 파일이 특정 폴더에 추가 될 때마다 파일에서 작동하는 백그라운드 프로세스가 자동으로 트리거됩니다. 백그라운드 프로세스는 일부 사전 정의 된 옵션과 함께 파일 이름을 인수로 사용하는 명령 행 유틸리티 일뿐입니다.

가능한 경우 성능 및 유지 관리상의 이유로 기본 Windows 기능을 사용하여이 작업을 수행하고 싶습니다. 작업 스케줄러를 사용하는 방법을 살펴 봤지만 트리거 시스템을 잠시 숙독 한 후에는 그 점을 잘 이해할 수 없었으며 필요한 작업을 수행 할 수 있는지 확실하지 않습니다.

제안 해 주셔서 감사합니다. 감사!


Linux의 inotify와 비슷하지만 Windows 용으로 생각해야합니다. Jnotify 가 도움이 될 수 있지만 Java이므로 너무 무거울 수 있습니다.
Keith

1
나도 이것에 대해 궁금했다 ... [MSDN 페이지] ( msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx) .
Keith

답변:


92

직장에서 우리는 폴더를 모니터링하기 위해 Powershell을 사용합니다.
추가 도구없이 Windows Vista (.NET 및 PowerShell이 ​​사전 설치되어 있기 때문에)에서 사용할 수 있습니다.

이 스크립트는 특정 폴더를 모니터링하고 로그 파일을 작성합니다. 작업을 교체하고 원하는대로 수행 할 수 있습니다. 예 : 외부 도구

로그 파일 예

11/23/2014 19:22:04, 생성됨, D : \ source \ New Text Document.txt
2014 년 11 월 23 일 19:22:09, 변경 : D : \ source \ New Text Document.txt
2014 년 11 월 23 일 19:22:09, 변경 : D : \ source \ New Text Document.txt
11/23/2014 19:22:14, 삭제됨, D : \ source \ New Text Document.txt

StartMonitoring.ps1

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "D:\source"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "D:\log.txt" -value $logline
              }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    Register-ObjectEvent $watcher "Changed" -Action $action
    Register-ObjectEvent $watcher "Deleted" -Action $action
    Register-ObjectEvent $watcher "Renamed" -Action $action
    while ($true) {sleep 5}

사용하는 방법

  1. 새로운 텍스트 파일 만들기
  2. 위 코드를 복사하여 붙여 넣기
  3. 다음 설정을 원하는대로 변경하십시오.
    • 모니터링 할 폴더 : $watcher.Path = "D:\source"
    • 특정 파일 형식 만 포함하는 파일 필터 : $watcher.Filter = "*.*"
    • 하위 디렉토리 포함 예 / 아니요 : $watcher.IncludeSubdirectories = $true
  4. 저장하고 이름을 바꿉니다. StartMonitoring.ps1
  5. 마우스 오른쪽 버튼을 클릭 하여 모니터링 시작 »PowerShell로 실행

모니터링을 중지하려면 PowerShell 창을 닫으면 충분합니다.

추가 자료


잘 작동하지만 중지 스크립트의 기능은 무엇입니까? "등록 취소 이벤트 : 'SourceIdentifier'매개 변수에 인수가 바인드 될 수 없습니다." pastebin.com/ugLB3a69
Jan Stanstrup

@ JanStanstrup 아마 두 번째 스크립트로 더 많은 사람들을 혼동했을 것입니다. 삭제하겠습니다. StartWatching.ps1모니터링을 중지하려면 창 을 간단히 닫는 것으로 충분합니다 . 당신이 당신의 첫 번째 스크립트에 포함하는 경우 두 번째 스크립트는 변수를 저장하는 작업 않는 $created, $changed, $deleted또는$renamed
nixda

답변 해주셔서 감사합니다. github에 파일을 업로드 할 때 cmd 프롬프트를 사용할 수 있다면 누구든지 제안 할 수 있습니까
m__

5

당신은 올바른 줄에있는 것 같습니다-작업 스케줄러를 사용하여 .bat 또는 .cmd 파일을 정기적으로 실행할 수 있으며 해당 파일은 줄로 시작하여 필요한 파일의 존재를 확인할 수 있습니다-사실, 나는 파일이 존재하지 않는지 확인하십시오. 예를 들면 다음과 같습니다.

@ECHO OFF
REM Example file
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS EXIT 1
REM All this gets done if the file exists...
:
:
EXIT 0

이 코드를 수정하여 루프에서 1 분 지연으로 루프에서 실행 한 다음 Windows 시작 폴더에 배치 파일에 대한 참조를 넣을 수도 있습니다.

@ECHO OFF
REM Example file
:LOOP    
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS GOTO SKIP01
REM All this gets done if the file exists...
:
:
:SKIP01
REM Crafty 1 minute delay...
PING 1.1.1.1 -n 10 -w 6000 >NUL
GOTO LOOP

실행중인 Windows 버전 및 설치된 추가 리소스 키트에 따라 지연을 달성하는 다른 방법이 있지만 PING 명령은 모든 상황에서 거의 작동합니다. 위의 PING 명령에서 10 개의 팬텀 PINGS는 6000ms (즉, 6 초) 지연으로 실행되며 배치 파일 루프간에 필요한 지연을 달성하기 위해이 값으로 재생할 수 있습니다.


btw, C : \> ping 1.1.1.1 -n 10 -w 6000 어떤 이유로 든 내 컴퓨터에서 1 분 10 초가 걸렸습니다. 그러나 -n 1 -w 60000은 정확히 1 분이 걸렸습니다.
barlop

@barlop - 십초 차이는 때문이다 -n 10-n 1.

@Randolph Potter 6 초, 10 초가 60 초가 아닙니까? 사용하는 -n 10은 10 배를 의미합니다.
barlop

당신 말이 맞을 것입니다. 나는 그것을 다시 가져 와서 내 금발 머리를 비난합니다.

모니터링 루프에이 루프를 사용하게되었습니다 IF NOT EXIST C:\NO_SUCH_FILE_EVER.foo. 해 키시지만 작동합니다. 아이디어 주셔서 감사합니다.
Snekse

3

제안 해 주셔서 감사합니다.

Linker3000의 폴더 폴링에 대한 대략적인 아이디어를 기반으로 VBScript를 작성하고 작업 스케줄러를 사용하여 시작시 실행되도록했습니다. 나는 이 리소스 에서 기본 구문을 얻었고 필요한 조정을했습니다.

나는 여전히 스크립트 중심을 이벤트 중심 시스템에서 실행하면서 어느 시점에서 그것을 최적화하고 싶지만 스크립트 작업을 할 시간이 부족합니다.

관심있는 사람을 위해 스크립트를 작성했습니다.

' FOLDER TO MONITOR
strFolder = "J:\monitored-folder"

' FREQUENCY TO CHECK IT, IN SECONDS
nFrequency = 10

strComputer = "."
strQueryFolder = Replace(strFolder, "\", "\\\\")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" &     strComputer & "\root\cimv2") 
Set colMonitoredEvents = objWMIService.ExecNotificationQuery ("SELECT * FROM __InstanceCreationEvent WITHIN " & nFrequency & " WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent='Win32_Directory.Name=""" & strQueryFolder & """'") 

Do 
    Set objLatestEvent = colMonitoredEvents.NextEvent
    strNewFile = objLatestEvent.TargetInstance.PartComponent
    arrNewFile = Split(strNewFile, "=")
    strFilePath = arrNewFile(1)
    strFilePath = Replace(strFilePath, "\\", "\")
    strFilePath = Replace(strFilePath, Chr(34), "")
    strFileName = Replace(strFilePath, strFolder, "")
    strTempFilePath = WScript.CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) & "\TEMP.M4A"

    ' DO THE OPERATION STUFF
    ' ...
Loop

(또한이 질문에 공식적으로 답하지 않고 싶지는 않습니다. 질문에 대한 자신의 답변을 받기를 싫어하지만 Linker3000의 답변을 감사로 찬성했습니다!)


2

DropIt (무료)을 볼 수 있습니다 . 이 프로그램은 들어오는 파일을 자동화 된 방식으로 처리하는 데 적합합니다. 이미지를 변환하거나 PDF를 분할하는 등 다른 명령 줄 프로그램으로 매개 변수를 이동, 복사, 삭제 및 전달할 수 있습니다.


2

조치가 변경된 파일을 복사하는 것이라면 robocopy / MON을 사용할 수 있습니다.

robocopy가 FileSystemWatcher를 사용하는지 또는 변경 사항을 폴링하여 작동하는지 알 수 없음


1

또는 Watch 4 Folder를 사용할 수 있습니다 . 분명히 프리웨어, 휴대용 및 Windows 7과 호환됩니다. 나는 그것을 시도하지는 않았지만 웹 검색을 통해 찾았으며 그것을 전달할 것이라고 생각했습니다.

나는 VBS 스크립트도 좋아하고 사이트에도 등장했다.


불행히도 유료 버전 만 휴대용입니다
nixda

이 소프트웨어 사용에 대해 생각하고있었습니다. 많은 사용자의 중요한 파일로 네트워크 공유를 모니터링한다고 믿습니까?
Paul Matthews

Watch4Folder의 무료 버전에는 하나의 "샘플"항목 만 구성 할 수 있습니다.
PeterCo


0

http://www.myassays.com/folder-poll 의 상용 도구 (무료가 아님) 폴더 폴을 사용 하여이 작업을 수행합니다. 사용자 친화적 인 관리자 응용 프로그램을 포함하여 쉽게 구성 할 수있는 Windows 응용 프로그램입니다. 또한 XML 구성 옵션이 있습니다. 실제 폴더 폴링은 Windows 서비스로 실행되므로 다시 시작할 때마다 자동으로 시작됩니다. 폴링 된 폴더에서 새 파일이 발견되면 응용 프로그램을 자동으로 시작할 수 있습니다 (사용자 정의 명령 줄 인수를 지정할 수 있음). 파일 복사 / 이동과 같은 다른 작업도 수행 할 수 있습니다. 또한 활동을 로그 파일에 기록 할 수 있으며 다른 고급 작업이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.