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)
.

È stato utile?

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top