2013-01-06 11 views
8

Sto provando a copiare circa 10 cartelle contenenti ciascuna un file .txt da ~ 3KB su una condivisione file remota con qualche secondo di latenza. Sto usando Powershells Copy-Item come questo:UnauthorizedAccessException using Copy-Item sul fileserver remoto

try 
{ 
    Copy-Item -Path $source -Destination $destination -Recurse -ErrorAction Stop 
} 
catch 
{ 
    Write-Error $_.Exception.ToString() 
} 

L'utente che esegue lo script di lettura, scrittura ed esecuzione autorizzazioni sulla condivisione fileserver e sulla fonte locale.

Alla prima esecuzione, la cartella di destinazione è vuota. Tutto funziona bene Alla seconda esecuzione, i file e le cartelle esistono già. Quindi, prima di eseguire il codice di cui sopra ho eseguire un controllo utilizzando Test-Path e nel caso in cui la cartella esiste un eliminare utilizzando Remove-Item come questo:

try 
{ 
    if(Test-Path -Path $path -ErrorAction Stop) 
    { 
     Remove-Item -Recurse -Path $path -ErrorAction Stop 
    } 
} 
catch 
{ 
    Write-Error $_.Exception.ToString() 
} 

Nessun altro modifica quei file. Tuttavia, quando eseguo lo script una dozzina di volte, una volta ogni tanto, per una ragione che non capisco, ottengo improvvisamente degli errori UnauthorizedAccessException per alcune delle cartelle durante la copia. L'errore esatto è:

System.UnauthorizedAccessException: accesso negato ---> System.ComponentModel.Win32Exception: accesso negato a Microsoft.PowerShell.Commands.FileSystemProvider.NativeDirectoryExists (String percorso) in sistema. Management.Automation.SessionStateInternal.IsItemContainer (CmdletProvider providerInstance, string path, contesto CmdletProviderContext

si prega di notare: sto ottenendo questi errori dopo l'eliminazione dei vecchi file sul telecomando il fileserver si è complimentato correttamente.

risposta

-3

Masi, la funzione copia-elemento di PowerShell non è proprio quella grande IMO. Perché non utilizzare l'ibrido Powershell/robocopy qui?

Esempio:

$source = "C:\temp" 

$destination ="\\\RemoteServer\Temp" 

robocopy $source $destination /s /mt:8 
+2

bene, semplicemente perché non è un buon progetto. stai mescolando codice non orientato agli oggetti con semplici comandi di produzione del testo. Ci sono molti svantaggi in questo tipo di gestione degli errori. l'utilizzo di cmdlet restituirà oggetti che posso utilizzare in seguito. È come usare * ping * quando hai * test-connection *. – masi

Problemi correlati