SCRIPT POWERSHELL CON LOG ERRORE
-
10-12-2019 - |
Domanda
Con l'aiuto di questo forum sono in grado di scrivere il seguente script utilizzando PowerShell che scarica i dati di massa da SharePoint con i metadati nel file CSV e anche il registro degli errori come file TXT.Ma il problema che sto affrontando qui è, copia solo l'ultimo errore. Voglio copia di tutti gli errori in file TXT.
Ho provato a usare
SET-CONTENUTO "C: \" $ ERROR
ancora non è in grado di risolverlo.
if((Get-PSSnapin "Microsoft.SharePoint.PowerShell") -eq $null)
{
Add-PSSnapin Microsoft.SharePoint.PowerShell
}
try
{
$destination = "C:\\Test\\"
$web = Get-SPWeb -Identity "http://xyz:4444/"
$list = $web.GetList("http://xyz:4444/Shared Documents/")
function ProcessFolder {
param($folderUrl)
$folder = $web.GetFolder($folderUrl)
foreach ($file in $folder.Files) {
#Ensure destination directory
$destinationfolder = $destination + "/" + $folder.Url
if (!(Test-Path -path $destinationfolder))
{
$dest = New-Item $destinationfolder -type directory
}
#Download file
$binary = $file.OpenBinary()
d
e
$stream = New-Object System.IO.FileStream($destinationfolder + "/" + $file.Name), Create
$writer = New-Object System.IO.BinaryWriter($stream)
$writer.write($binary)
$writer.Close()
}
}
$exportlist = @()
$list.Items | foreach {
$obj = New-Object PSObject -Property @{
"Title" = $_["Title"]
"Name" = $_["Name"]
"Modified Date" = $_["Modified"]
"Modified By" =$_["Modified By"]
"Size"= $_["File Size"]
"Path" = $web.Url + "/" + $_.File.Url
}
$exportlist += $obj
$exportlist | Export-Csv -path 'C:\Test\MyList.csv' -noType
}
#Download root files
ProcessFolder($list.RootFolder.Url)
#Download files in folders
foreach ($folder in $list.Folders) {
ProcessFolder($folder.Url)
}
}
catch
{
#Write "Error: copy-item: $_" >>c:\logfile.txt
$("$file.name: " + $_.Exception.Message) | out-file c:\file.log -Append
#set-content "c:\log2.txt" $error
}
finally
{
#Download root files
ProcessFolder($list.RootFolder.Url)
#Download files in folders
foreach ($folder in $list.Folders) {
ProcessFolder($folder.Url)
}
}
#DownloadMetadata ($list.RootFolder.Url)
. Soluzione 2
Ho corretto il mio blocco di cattura prova e sembra funzionare bene
if((Get-PSSnapin "Microsoft.SharePoint.PowerShell") -eq $null)
{
Add-PSSnapin Microsoft.SharePoint.PowerShell
}
$destination = "C:\\Test\\"
$web = Get-SPWeb -Identity "http://xyz:4444/"
$list = $web.GetList("http://xyx:4444/Shared Documents/")
function ProcessFolder {
param($folderUrl)
$folder = $web.GetFolder($folderUrl)
foreach ($file in $folder.Files) {
#Ensure destination directory
$destinationfolder = $destination + "/" + $folder.Url
if (!(Test-Path -path $destinationfolder))
{
$dest = New-Item $destinationfolder -type directory
}
#Download file
try
{
$binary = $file.OpenBinary()
$stream = New-Object System.IO.FileStream($destinationfolder + "/" + $file.Name), Create
$writer = New-Object System.IO.BinaryWriter($stream)
$writer.write($binary)
$writer.Close()
}
catch
{
#Add-content "c:\log3.txt" $error
Write "Error: $file.name: $_" >>c:\logfile.txt
continue;
}
}
}
$exportlist = @()
$list.Items | foreach {
$obj = New-Object PSObject -Property @{
"Title" = $_["Title"]
"Name" = $_["Name"]
"Modified Date" = $_["Modified"]
"Modified By" =$_["Modified By"]
"Size"= $_["File Size"]
"Path" = $web.Url + "/" + $_.File.Url
}
$exportlist += $obj
$exportlist | Export-Csv -path 'C:\Test\MyList.csv' -noType
}
#Download root files
ProcessFolder($list.RootFolder.Url)
#Download files in folders
foreach ($folder in $list.Folders) {
ProcessFolder($folder.Url)
}
. Altri suggerimenti
Si vede solo l'ultimo errore perché il contenuto di set sovrascrive il contenuto esistente, utilizzare invece contenuto aggiuntivo.
Se vuoi avere un approccio più comprensivo, come suggerito Robert, c'è un modo più potente (?) di farlo con Start / Stop-Transcript che prende tutte le uscite della console tra le chiamate del cmdlet di avvio e arresto e l'emette in un file.
È possibile utilizzare Write-Output "Logging text"
nelle tue catture e poi quando si esegue lo script è possibile eseguirlo come
MyFancyScriptName.ps1 > C:\file.log
.