1 votes

Get-ChildItem | Copy-Item

Essayer de déchiffrer pourquoi le copy-item ne fonctionne pas comme prévu dans mon ps script. J'essaie de rechercher dans mes serveurs de fichiers tous les fichiers *.pst sur tous les lecteurs joints/valides, puis de copier les fichiers .pst trouvés vers un emplacement de partage différent. Le script ci-dessous ne me donne pas les résultats escomptés. Le site Out-File ne montre aucun fichier .pst trouvé. Lorsque je vérifie le dossier de destination, je constate qu'un seul fichier *.pst a été copié. J'ai vérifié qu'il y en avait plusieurs dans différents répertoires et sous-dossiers sur le serveur de fichiers. Le fichier $Computers.txt n'indique aucun fichier .pst trouvé ou copié. Capture d'écran
Voici mon script de débutant.

$Computers = hostname
get-psdrive -PSProvider "FileSystem" `
| foreach {Write-Output $Computers $_.Root;get-childitem $_.Root -include *.PST -Recurse -erroraction silentlyContinue | Copy-Item -Destination "\\Server1\PSTsbackupfolder\" `
| Select-Object -Property $Computers,Directory,Name} | Format-Table -AutoSize `
| Out-File -FilePath "\\Server1\Results\$Computers.txt"

Si je retire | Copy-Item -Destination "\\Server1\PSTsbackupfolder\" à partir de mon script, le fichier de sortie $Computers.txt me montre les résultats attendus, mais l'objectif de copier ces fichiers .pst est toujours une attente nécessaire. Les résultats du fichier de sortie pour $Computers.txt : Capture d'écran Tout conseil est le bienvenu.

0voto

RobbieCrash Points 1081

Vous devez ajouter -Append a Out-File pour obtenir la liste entière ; chaque fois que vous itérez dans votre liste, vous créez un nouveau fichier.

Si vous retirez Copy-Item du tuyau, vous envoyez la sortie de Get-ChildItem au reste du tuyau. Si vous gardez Copy-Item là, vous envoyez la sortie de Copy-Item qui est juste le seul fichier sur lequel il a agi.

Si vous essayez de copier tous les fichiers trouvés sur le ServeurA vers \\server1\PSTBackupFolder vous aurez beaucoup plus de chances d'exécuter Robocopy sur le serveur A avec quelque chose comme ce qui suit :

Get-PSDrive -PSProvider FileSystem | ForEach-Objecct {robocopy $_.root *.pst /z /v /r:5 /log:\\Server1\PSTsbackupfolder\RoboCopy.$($_.Name).log \\Server1\PSTsbackupfolder}

Cela permettra à tous les FileSystem PSDrives puis itère à travers chacun des lecteurs et robocopy tous les fichiers situés sous la racine (la lettre de lecteur) qui correspondent à *.pst a \\Server1\PSTBackupfolder . Nous les copions en mode reprenable ( /z ), de manière verbeuse ( /v ), réessayer la copie 5 fois ( /r:5 ), et enregistre toutes les transactions dans \\server1\pstbackupfolder\robocopy.DRIVELETTER.Log

Nous utilisons une substitution en ligne ( $($_.Name) ) de diviser les journaux de copie en fichiers séparés parce que c'est beaucoup plus facile à gérer lorsque vous essayez de comprendre pourquoi le PST de Bill n'a pas été copié depuis le lecteur L : si vous n'avez à parcourir que 50 entrées au lieu de 50.000.

0voto

Get-Novice Points 11

Je suis certain qu'il existe des façons meilleures, plus propres et plus efficaces d'écrire ce code. Je prendrai en compte vos conseils/suggestions et j'essaierai d'améliorer mon code, mais à mon niveau, je n'ai pas le choix. niveau de compétence actuel - Voici ce que j'ai pu rassembler et qui m'a donné le résultat final que je recherchais.

$FileServer = hostname
$DestPath = "c:\PSTs\$FileServer"
#Checks if the Destination Dir/Path exists, if not it creates the folder and names it whatever the hostname is
If ((Test-Path -path $DestPath -PathType Container) -eq $false) {New-Item $DestPath -ItemType Directory}
#Searches for .psts files on host, exports results to .csv file.
Get-psdrive -PSProvider "FileSystem" `
| ForEach-Object {(get-childitem $_.Root -recurse -file -Filter *.PST -erroraction silentlyContinue `
| Select-Object -Property Directory,Name)} | Export-Csv -path "$DestPath\$FileServer.csv" -NoTypeInformation -Force
#Sets variable for .CSV file from previous command
$PstPath = Get-Content -Path "$DestPath\$FileServer.csv"
#Modifying .CSV for preceding commands to work.
$PSTsCSV = "$DestPath\$FileServer.csv"
($PstPath).Replace('"Directory",','"Path"').replace('"Name"','').replace('","','\') | Out-File -FilePath $PSTsCSV -force
#Reads each line of .CSV file, copies .pst file from source to destination, if file name exsists...
#in destination, it will re-name file appending a consecutive number
$CSV = Import-Csv $DestPath\$FileServer.csv
Get-ChildItem -Path $CSV.Path | ForEach-Object {
    $num=1
    $newName = Join-Path -Path $DestPath -ChildPath $_.Name
    while(Test-Path -Path $newName)
    {
       $newName = Join-Path $DestPath ($_.BaseName + "_$num" + $_.Extension)
       $num+=1
    }
    $_ | Copy-Item -Destination $newName
}

J'ai trouvé un problème dans mon script, voici la ligne en question. ($PstPath).Replace('"Directory",','"Path"').replace('"Name"','').replace('","','\') | Out-File -FilePath $PSTsCSV -force

Si vous recherchez des .psts sur un serveur qui donne no .pst, la sortie vers le fichier .csv n'aura aucun résultat. Une erreur apparaîtra, indiquant Vous ne pouvez pas appeler une méthode sur une expression à valeur nulle.

You cannot call a method on a null-valued expression.
At D:\Scripts\PowerShell\tempCodeRunnerFile.ps1:6 char:1
+ ($PstPath).Replace('"Directory",','"Path"').replace('"Name"','').repl ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

pour remédier [du mieux que j'ai pu comprendre], dans le cas où aucun .psts n'est trouvé j'ai réécrit le code en ajoutant -ErrorAction Stop donc le script s'arrête à ce point, comme ceci

Get-Content $PSTsCSV.Replace('"Directory",','"Path"').replace('"Name"','').replace('","','\') -ErrorAction Stop | Out-File -FilePath $PSTsCSV -force

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X