2017-01-15 10 views
2

Powershell을 처음 사용했습니다. 디렉토리에있는 파일을 감시하고 콘솔에 변경 사항을보고하는 스크립트를 작성 중입니다.스크립트 블록에서 코드 중복 제거 방법?

FS "감시자"에 사용하는 스크립트 블록에서 코드 중복이 많이 발생합니다.

다음은 스크립트 블록의 발췌 문장입니다. 필요한 경우 전체 스크립트를 게시 할 수 있습니다. 조금 더 길어서 조금 더 진행됩니다.

# Filter all files 
$filter = "*.*" 
$watcher = New-Object IO.FileSystemWatcher $watchdir, $filter -Property @{ 
    IncludeSubdirectories = $true 
    EnableRaisingEvents = $true 
} 

# File creation 
Register-ObjectEvent $watcher Created -SourceIdentifier Created -Action { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host $message 
} 

# File change 
Register-ObjectEvent $watcher Changed -SourceIdentifier Changed -Action { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host $message 
} 

# File rename 
... 

# File delete 
... 

코드 작성량을 줄이려면이 패턴을 작성하는 좋은 패턴이나 더 좋은 방법이 있습니까?

+1

함수에 중복 코드를 포함하십시오. 그런 다음 그 기능을 자주 호출하십시오. –

+0

기본적으로 이것을 수행하는 관용적 인 방법이 있는지 궁금합니다. 예를 들어'$ watcher' 변수에 대한 범위를 처리하고 params를 전달하는 방법은 무엇입니까? – jmreicha

답변

3

를, 스크립트 블록은이 경우에, 그래서 그냥 변수에 넣어 그 따라 통과, 정확히 동일 :

$action = { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $console_message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host message 
} 

# File creation 
Register-ObjectEvent $watcher Created -SourceIdentifier Created -Action $action 

# File change 
Register-ObjectEvent $watcher Changed -SourceIdentifier Changed -Action $action 

이 스크립트 블록에서 중복이 있지만, 정확하게 동일하지 어디 있는지 예를 게시 할 경우, 다음 방법에 가장 추상적 그 예를 보여 쉬울 것이다. 원터치 솔루션이 아닐 수도 있습니다.

+0

운 좋게도 행동은 모두 동일하므로이 접근법이 나를 위해 잘 작동합니다. 고맙습니다. – jmreicha

-1

당신은 이렇게하는 방법에 대한 설명은 여기를 참조 함수로 재사용 코드를 포장해야합니다 다음

function FileChange { 
    Register-ObjectEvent $watcher Created -SourceIdentifier Created -Action { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $console_message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host message 
} 

사용 : http://windowsitpro.com/windows/create-your-own-powershell-functions

를 귀하의 경우에는, 나는 다음과 같은 함수를 만드는 것 반복되는 코드 교체 : 당신의 예에서

# Filter all files 
$filter = "*.*" 
$watcher = New-Object IO.FileSystemWatcher $watchdir, $filter -Property @{ 
IncludeSubdirectories = $true 
EnableRaisingEvents = $true 
} 

# File creation 
FileChange() 

# File change 
FileChange() 
+3

샘플 함수는 구문 적으로 유효하지 않으며 스크립트는 동일한 이벤트 (생성됨)에 대한 처리기를 두 번 등록합니다 –