FileSystemWatcher を使用してディレクトリ内の 2 つのファイル拡張子を取得する

FileSystemWatcher を使用してディレクトリ内の 2 つのファイル拡張子を取得する

私はpdfとrtfファイルのみを取得しようとしていますが、変数をエコーすると「true」という結果が返されます

$watcher = New-Object System.IO.FileSystemWatcher 
Write-Host "First line of the script, getting the watcher folder " $watcher -ForegroundColor white
$watcher.Path = "C:\Users\Demo Site"
Write-Host "This is the current path " $watcher.Path -ForegroundColor white
$watcher.Filter = "*.rtf" -or "*.pdf" 
Write-Host "Filtering by: " $watcher.Filter -ForegroundColor white
$watcher.IncludeSubdirectories = $true
Write-Host "Including Subdirectories" -ForegroundColor white
$watcher.EnableRaisingEvents = $true  

$action = {
    $path = $Event.SourceEventArgs.FullPath
    $path2 = $path.replace("C:\Users\", "")
    $path2 = $path2.replace("\","/")
    $changeType = $Event.SourceEventArgs.ChangeType
    $logline = "$(Get-Date -Format F) , File was $changeType in:  $path"
    $logFile = "D:\MoveLog.txt"

    Add-content -Path $logFile -value $logline  
    # moves the file captured by the watcher
    Start-Sleep -s 2
    Move-PnPFile -ServerRelativeUrl "/sites/1/$path2" 
        -TargetUrl "/sites/2" -OverwriteIfAlreadyExists 
        -Force -Confirm:$True 
        -ErrorAction SilentlyContinue -ErrorVariable ProcessError
    # added to make sure that the larger files finish uploading
    If ($ProcessError)
    {
        Write-Warning -Message "File not copied!"
        Write-Warning -Message "Waiting 5 seconds and trying again"
        Start-Sleep -s 5
        $logFile = "D:\MoveLog.txt"
        Add-content -Path $logFile -value " $(Get-Date -Format F),  Error while Copying file - Let's try this again!"
        Move-PnPFile -ServerRelativeUrl "/sites/1/$path2" 
            -TargetUrl "/sites/1/$path2" -Force -Confirm:$False 
            -ErrorAction SilentlyContinue -ErrorVariable ProcessError
        If ($ProcessError)
        {
            Write-Warning -Message "File not copied!"
            Write-Warning -Message $error[0].Exception.Message
            $errorLog = " $(Get-Date -Format F),  $error[0].Exception.Message"
            Write-Host  "12. Writing to Log" -ForegroundColor red
            $logFile = "D:\MoveLog.txt"
            Add-content -Path $logFile -value $errorLog
                $to_mail = ""
                $fr_mail = ""
                $subject = "An error has occured when moving in SharePoint"
                $serverDetails = ""
                $port = 
            Send-MailMessage -To $to_mail -From $fr_mail -Subject $subject -Body $errorLog 
                -Priority High -SmtpServer $serverDetails -Port $port
        }
        else
        {
            Write-Host  "n 8. After 1 error, Succesfully moved newly created file to different sharepoint library" -ForegroundColor green
        }
    }
    else
    {
        Write-Host  "n 8. Successfully moved newly created file to different sharepoint library with no errors" -ForegroundColor green
    }
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
Register-ObjectEvent $watcher "Created" -Action $action
# Register-ObjectEvent $watcher "Changed" -Action $action
while($true){
    sleep 5
}

$watcher.Filter = "*.rtf" -or "*.pdf"2 つのファイルだけを取得するように変更するにはどうすればよいですか?

すべてのファイル拡張子を取得すると、.tmp も取得されますが、それに対して何か操作を行うまでに削除されるため、FAIL メッセージが生成されます。

私も試してみましたdir .\* -include ('*.xsl', '*.xslt') -recurse

エラーは出ないのですが、$watcher.Filter2つの拡張子を付けてエコーするとtrue

答え1

いくつかのエラーの後、私はこれを動作させることができました。

ドキュメントがサーバーのスペースを占有しないように、SharePoint ライブラリ間でファイルを移動するためのスクリプトを作成しました。

基本的に:

  1. ファイルはERPを介してサーバー上の同期されたOneDriveフォルダーに書き込まれます

  2. FileSystemWatcher によって検出される

  3. ユーザーがアクセスできるアーカイブ ライブラリに移動します。

必要になるだろうSharePointPnP

Connect-PnpOnline -Url https://site.sharepoint.com/sites/ -UseWebLogin
#disconects from Sharepoint
#disconnect-PnpOnline 

$logFile = "D:\SharePointMoveLog.txt"
#for debugging 
start-transcript

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
Write-Host "First line of the script, getting the watcher folder " $watcher -ForegroundColor white
    $watcher.Path = "C:\Users\Demo Site - Staging"
Write-Host "This is the current path " $watcher.Path -ForegroundColor white
    $watcher.Filter = "*.*" 
Write-Host "Filtering by: " $watcher.Filter -ForegroundColor white
    $watcher.IncludeSubdirectories = $true
Write-Host "Including Subdirectories" -ForegroundColor white
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED

$action = 
    {
    $fileName = Split-Path $Event.SourceEventArgs.FullPath -leaf
Write-Host $fileName
        If ($fileName -like '*.pdf')
            {
                 $path = $Event.SourceEventArgs.FullPath
###PDF
                Write-Host "1. New File has been Created in: " $path -ForegroundColor green
                                $path2 = $path.replace("C:\Users\Demo Site - Staging\", "")
                Write-Host "`n 2. Removing the begining of directory from Path: " $path2 -ForegroundColor green
                                $path2 = $path2.replace("\","/")
                Write-Host "`n 3. Replacing \ with / in order to get file to copy to SP: " $path2 -ForegroundColor green
                                $changeType = $Event.SourceEventArgs.ChangeType
                Write-Host "`n 4. File was changed - Type: " $changeType -ForegroundColor green
                                $logline = "$(Get-Date -Format F) , `r`n File was $changeType in: `r`n $path"
                Write-Host "`n 5. Creating a line for the logs: " $logline -ForegroundColor green
                $logFile = "D:\SharePointMoveLog.txt"
                            Add-content -Path $logFile -value $logline  
                Write-Host "`n New line added to the log ${logline}"  -ForegroundColor green
                                #moves the file captured by the watcher
                Write-Host "`n 6. Waiting 2 seconds before moving to ensure file uploads succesfuly" -ForegroundColor green
                                Start-Sleep -s 2
                                Move-PnPFile -ServerRelativeUrl "/sites/test1/Staging/$path2" `
                                        -TargetUrl "/sites/test1/Archive/$path2" -OverwriteIfAlreadyExists `
                                        -Force -Confirm:$True `
                                        -ErrorAction SilentlyContinue -ErrorVariable ProcessError
                                        #added to make sure that the larger files finish uploading
                                    If ($ProcessError)
                                        {
                                            Write-Warning -Message "File not copied!"
                                            Write-Warning -Message "Waiting 5 seconds and trying again"
                                            Start-Sleep -s 5
                $logFile = "D:\SharePointMoveLog.txt"
                                            Add-content -Path $logFile -value "`r`n $(Get-Date -Format F), `r`n Error while Copying file - Let's try this again!"
                                            Move-PnPFile -ServerRelativeUrl "/sites/test1/Staging/$path2" `
                                        -TargetUrl "/sites/test1/Archive/$path2" -Force -Confirm:$False `
                                        -ErrorAction SilentlyContinue -ErrorVariable ProcessError
                                            If ($ProcessError)
                                                {
                                                    Write-Warning -Message "File not copied!"
                                                    Write-Warning -Message $error[0].Exception.Message
                                                    $errorLog = "`r`n $(Get-Date -Format F), `r`n $error[0].Exception.Message"
                                                    Write-Host  "12. Writing to Log" -ForegroundColor red
                $logFile = "D:\SharePointMoveLog.txt"
                                                    Add-content -Path $logFile -value $errorLog
                                                        $to_mail = ""
                                                        $fr_mail = ""
                                                        $subject = "An error has occured when moving in SharePoint Test Site"
                                                        $serverDetails = ""
                                                        $port = 
                                                    Send-MailMessage -To $to_mail -From $fr_mail -Subject $subject -Body $errorLog `
                                                                        -Priority High -SmtpServer $serverDetails -Port $port
                                                }
                                            else
                                                {
                        Write-Host  "`n 7. After 1 error, Succesfully moved newly created file to different sharepoint library" -ForegroundColor green
                                                    $logFile = "D:\SharePointMoveLog.txt"
                                                    Add-content -Path $logFile -value "`r`n $(Get-Date -Format F), `r`n After 1 error, Succesfully moved newly created file to different sharepoint library"
                                                }
                                        }
                                    else
                                        {
                Write-Host  "`n 7. Succesfully moved newly created file to different sharepoint library with no errors" -ForegroundColor green
                                            $logFile = "D:\SharePointMoveLog.txt"
                                            Add-content -Path $logFile -value "`r`n $(Get-Date -Format F), `r`n Succesfully moved newly created file to different sharepoint library with no errors"
                                        }
            }



        elseif ($fileName -like '*.rtf')
            {
###RTF

                $path = $Event.SourceEventArgs.FullPath
                Write-Host "1. New File has been Created in: " $path -ForegroundColor green
                                $path2 = $path.replace("C:\Users\Demo Site - Staging\", "")
                Write-Host "`n 2. Removing the begining of directory from Path: " $path2 -ForegroundColor green
                                $path2 = $path2.replace("\","/")
                Write-Host "`n 3. Replacing \ with / in order to get file to copy to SP: " $path2 -ForegroundColor green
                                $changeType = $Event.SourceEventArgs.ChangeType
                Write-Host "`n 4. File was changed - Type: " $changeType -ForegroundColor green
                                $logline = "$(Get-Date -Format F) , `r`n File was $changeType in: `r`n $path"
                Write-Host "`n 5. Creating a line for the logs: " $logline -ForegroundColor green
                $logFile = "D:\SharePointMoveLog.txt"
                            Add-content -Path $logFile -value $logline  
                Write-Host "`n New line added to the log ${logline}"  -ForegroundColor green
                                #moves the file captured by the watcher
                Write-Host "`n 6. Waiting 2 seconds before moving to ensure file uploads succesfuly" -ForegroundColor green
                                Start-Sleep -s 2
                                Move-PnPFile -ServerRelativeUrl "/sites/test1/Staging/$path2" `
                                        -TargetUrl "/sites/test1/Archive/$path2" -OverwriteIfAlreadyExists `
                                        -Force -Confirm:$True `
                                        -ErrorAction SilentlyContinue -ErrorVariable ProcessError
                                        #added to make sure that the larger files finish uploading
                                    If ($ProcessError)
                                        {
                                            Write-Warning -Message "File not copied!"
                                            Write-Warning -Message "Waiting 5 seconds and trying again"
                                            Start-Sleep -s 5
                $logFile = "D:\ManagementGateway\SharePointLogs\USA\SharePointMoveLog.txt"
                                            Add-content -Path $logFile -value "`r`n $(Get-Date -Format F), `r`n Error while Copying file - Let's try this again!"
                                            Move-PnPFile -ServerRelativeUrl "/sites/test1/Staging/$path2" `
                                        -TargetUrl "/sites/test1/Archive/$path2" -Force -Confirm:$False `
                                        -ErrorAction SilentlyContinue -ErrorVariable ProcessError
                                            If ($ProcessError)
                                                {
                                                    Write-Warning -Message "File not copied!"
                                                    Write-Warning -Message $error[0].Exception.Message
                                                    $errorLog = "`r`n $(Get-Date -Format F), `r`n $error[0].Exception.Message"
                                                    Write-Host  "12. Writing to Log" -ForegroundColor red
                $logFile = "D:\SharePointMoveLog.txt"
                                                    Add-content -Path $logFile -value $errorLog
                                                        $to_mail = ""
                                                        $fr_mail = ""
                                                        $subject = "An error has occured when moving in SharePoint"
                                                        $serverDetails = ""
                                                        $port = 
                                                    Send-MailMessage -To $to_mail -From $fr_mail -Subject $subject -Body $errorLog `
                                                                        -Priority High -SmtpServer $serverDetails -Port $port
                                                }
                                            else
                                                {
                        Write-Host  "`n 7. After 1 error, Succesfully moved newly created file to different sharepoint library" -ForegroundColor green
                                                    $logFile = "D:\SharePointMoveLog.txt"
                                                    Add-content -Path $logFile -value "`r`n $(Get-Date -Format F), `r`n After 1 error, Succesfully moved newly created file to different sharepoint library"
                                                }
                                        }
                                    else
                                        {
                Write-Host  "`n 7. Succesfully moved newly created file to different sharepoint library with no errors" -ForegroundColor green
                                            $logFile = "D:\SharePointMoveLog.txt"
                                            Add-content -Path $logFile -value "`r`n $(Get-Date -Format F), `r`n Succesfully moved newly created file to different sharepoint library with no errors"
                                        }
            }
    }
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
#    Register-ObjectEvent $watcher "Changed" -Action $action
    while ($true) {sleep 5}

現時点では、時々発生する小さなバグがあり、RTF でのみ失敗し、次のエラーが発生します。

Server relative urls must start with SPWeb.ServerRelativeUrl Cannot open "Doc12345.rtf": no such file or folder.

ファイルを手動でドロップすると機能するので、なぜこのエラーが発生するのかは不明です。

以前にも同様のエラーが発生しましたが、これは SharePoint ライブラリ内の異なるフォルダー構造が原因でした。フォルダー構造がまったく同じであることを確認することで、この問題は解決しました。

関連情報