Я хочу выбрать только файлы 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
Я не получаю ошибку, но когда я вывожу echo $watcher.Filter
с 2 расширениями, я получаюtrue
решение1
После нескольких ошибок мне удалось заставить это работать,
Я создал этот скрипт для перемещения файлов между библиотеками SharePoint, чтобы документы не занимали место на сервере.
По сути:
Файлы записываются в синхронизированную папку OneDrive на сервере с помощью ERP
Получите поддержку FileSystemWatcher
Перейдите в архивную библиотеку, где пользователи смогут получить к ней доступ.
Тебе понадобится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. Убедившись, что они абсолютно идентичны, я решил эту проблему.