2016-10-10 57 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