2016-10-10 62 views
1

我寫了一些PowerShell來檢查新文件,並且當一個新文件被創建時它會運行一個動作。文件監視器存檔器Powershell

該操作是檢查文件名並檢查以前的版本,如果有以前的版本,則將以前的版本移動到存檔文件夾。以前的版本被定義爲這樣:

文件名結構:XXXX-XXXX-xx.pdf

首先XXXX可以是字符+數字的任何量。

第二個xxxx可以是任意數量的字符+數字。

第三部分只有數字00到99例如01 02 03

所以,如果我放在文件85080-00-02.pdf和85080-00-01.pdf存在它將移動後者文件到存檔文件夾,現在這一切工作正常與代碼我目前有。

該系統將由標準工程人員使用,因此我需要確保所有用戶錯誤都得到滿足。當我在第三部分使用字符運行我的代碼時,例如85080-00-0t(想象有人偶然鍵入t而不是5,不要問我如何,但我知道會發生),它會停止工作。

  1. 爲什麼我在任何地方看不到任何錯誤?如果我在代碼中添加Write-Host,我可以看到它在ISE中顯示輸出,但是當上述情況發生時我沒有看到任何錯誤。

  2. 我如何得到這個正常工作?我可以告訴錯誤是因爲我的代碼試圖從字符串-1,這顯然導致它的問題。

因此,如何能我說:

如果$olddw =任何數量從00 - 99進行的代碼,否則什麼也不做。

# Enter the root folder you want to monitor 
$folder = **FOLDER LOCATION** 
$archivefolder = **ARCHIVE FOLDER LOCATION** 

# Enter the log file location 
$log = **LOG LOCATION** 

# You can enter a wildcard filter here. 
$filter = '*.*' 
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{ 
    IncludeSubdirectories = $false; 
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite' 
} 

#New file ObjectEvent 
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
    #Get new filename and create log 
    $name  = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Out-File -FilePath $log -Append -InputObject "The file '$name' was $changeType at $timeStamp" 

    #Set old filename 
    $oldname = $name.Substring(0, $name.Length-4) 
    $olddw = "{0:D2}" -f (($oldname.Substring($oldname.Length - 2)) - 1) 
    $oldfilename = ($oldname.Substring(0, $oldname.Length-2) + $olddw + ".pdf") 
    $oldfilelocation = ($folder + $oldfilename) 

    #Check if old filename exists if so move it to archive folder 
    $FileExists = Test-Path $oldfilelocation 
    if ($FileExists -eq $true) { 
     Move-Item $oldfilelocation $archivefolder 
     Out-File -FilePath $log -Append -InputObject "The file '$oldfilename' was Archived at $timeStamp" 
    } else { 
     # do nothing 
    } 
} 

#To view current ObjectEvent's 
#Get-EventSubscriber 

#To stop current ObjectEvent 
#Unregister-Event FileCreated 

回答

2

你有什麼存在的理由路徑應永遠使用字符串連接建立了一個最好的例子。什麼是最有可能的情況是,你沒有後綴(回)定義$folder斜線:

$folder = 'C:\some\folder' 

,這樣的聲明

$oldfilelocation = ($folder + $oldfilename) 

構造這樣的路徑:

C:\some\folder85080-00-02.pdf 
#   ^^ 
#    `- lack of backslash here!

其沒有按不存在,所以Test-Path返回$false,沒有任何東西被移動。

改變這一行:

$oldfilelocation = ($folder + $oldfilename) 

到這一點:

$oldfilelocation = Join-Path $folder $oldfilename 

,問題應該會消失。

一個更好的解決辦法是(通過FullPath參數)與FileInfo對象的工作:

​​

如果你也想處理的2位數的指數錯別字做這樣的事情:

Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
    $name  = $Event.SourceEventArgs.Name 
    $path  = $Event.SourceEventArgs.FullPath 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 

    Out-File -FilePath $log -Append -InputObject "The file '$name' was $changeType at $timeStamp" 

    $f = Get-Item $path 

    $cutoff = $f.BaseName.Length - 2 
    $index = $f.BaseName.Substring($cutoff) 
    if ($index -like '[0-9][0-9]') { 
     $oldindex = '{0:D2}' -f ([int]$index - 1) 
     $oldfilename = ($f.BaseName.Substring(0, $cutoff) + $oldindex + $f.Extension) 
     $oldfilelocation = Join-Path $f.Directory.FullName $oldfilename 

     if (Test-Path $oldfilelocation) { 
      Move-Item $oldfilelocation $archivefolder 
      Out-File -FilePath $log -Append -InputObject "The file '$oldfilename' was Archived at $timeStamp" 
     } 
    } 
} 
+0

下午Ansgar文件的移動工作正常我已經在我的帖子中說過。我對我的鏈接進行了硬編碼,我剛剛在代碼中將它們更改爲變量,因此可以輕鬆讀取它們。代碼的第二部分完全按照我希望它感謝您的輸入的方式工作。 ($ index-like'[0-9] [0-9]')是我正在尋找的!謝謝 – bepster