Copier des dossiers sans fichiers, des dossiers sans dossiers, ou tout ce qui utilise PowerShell

j'aimerais être capable d'écrire un script PowerShell qui prendrait un dossier (ou un ensemble de dossiers) et de les dupliquer dans lequel la structure de dossier (sans les fichiers) pourrait être créé, où la structure du fichier (sans les dossiers) pourrait être créé, ou dans lequel les deux fichiers (tous ou ceux sélectionnés) et des dossiers peuvent être créés.

    Example:

    C:ProdData has 3 subfolders in it
    C:ProdDataFld1
    C:ProdDataFld2
    C:ProdDataFld3 - has 2 subfolders under it
    C:ProdDataFld3MyFolder1
    C:ProdDataFld3MyFolder2

Chaque dossier ci-dessus a un divers nombre de fichiers de différentes tailles, de différentes fichier extension.

j'aimerais avoir un script PowerShell qui dupliquerait cette structure de dossiers ailleurs, me donnant le choix de Structure Des Dossiers Seulement,Uniquement Les Fichiers, ou fichiers et dossiers pour être copié.

dans ce qui précède, j'aimerais pouvoir copier C:ProdData à un autre dossier, renommant essentiellement ProdData en TestData (c'est-à-dire,C:ProdData copié C:TestData), ou pour copier l'intégralité structure du dossier.

C:ProdData dans un autre dossier, qui est un sous-dossier de quelque chose d'autre: C:TestAreaTestFolders12-04-01TestDataProdDataFld1, etc...

et sélectivement choisir d'inclure des dossiers, des fichiers ou .

la solution idéale serait (pour les dossiers seulement) de prendre la structure du dossier, de l'exporter/la sauvegarder, de la lire et de créer cette même structure ailleurs. Certaines solutions que j'ai trouvées ont dit qu'ils ont copié la structure du dossier seulement, mais si les données existent, qui obtient copié aussi et que vous ne pouvez pas exclure l'un ou l'autre. J'ai une solution partielle pour les fichiers seule exigence que les semi-conserves le chemin, mais il faudrait un fichier:

c:ProdDataFld1MyFile.dat

et copie à:

c:TestDatayyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat

mais ce n'est pas quelque chose qui pourrait facilement être décodé et serait impossible de réintégrer la structure source. J'aimerais savoir comment faire sans réinventer la roue.

17
demandé sur Peter Mortensen 2012-04-03 19:35:59

4 réponses

Pour tout copier dans un dossier hierarchie

Copy-Item $source $dest -Recurse -Force

copier la hierarchie, vous pouvez essayer:

$source = "C:\ProdData"
$dest = "C:\TestData"
Copy-Item $source $dest -Filter {PSIsContainer} -Recurse -Force

Pour aplatir une structure de fichier, vous pouvez essayer:

$source = "C:\ProdData"
$dest = "C:\TestData"
New-Item $dest -type directory
Get-ChildItem $source -Recurse | `
    Where-Object { $_.PSIsContainer -eq $False } | `
    ForEach-Object {Copy-Item -Path $_.Fullname -Destination $dest -Force} 

Bonne chance!

17
répondu Reinout 2014-12-09 19:51:17

voici quelques idées pour gérer chaque situation que vous décrivez.

Structure Des Dossiers Seulement

cela copiera la source vers une destination, en reprenant les sous-répertoires mais en excluant tous les fichiers.

robocopy $source $dest /e /xf *.*

Les Fichiers Uniquement (Aplatir La Structure)

il y a plusieurs façons de gérer cela, mais je ne connais pas de façon particulièrement bonne ou élégante. Voici une approche maladroite mais efficace - pour chaque sous-répertoire, il exécute un copie non-récursive dans un dossier de destination racine. Des critiques ou de meilleures alternatives seraient les bienvenues.

Get-ChildItem $source -Recurse |
  Where-Object { $_.PSIsContainer -eq $true } |
  Foreach-Object { robocopy $_.FullName $dest }

Tout

ce scénario est le plus simple du groupe.

robocopy $source $dest /e

vous pouvez expérimenter vous-même avec les commutateurs (référencement robocopy /? en cours de route) afin d'affiner le processus. Le scénario le plus délicat à mon avis est celui qui aplatit la structure du répertoire. Tu auras des décisions à prendre, comme comment vous souhaitez gérer le même nom de fichier apparaissant dans plusieurs répertoires.

en ce qui concerne la façon d'accepter les options de la ligne de commande, je suggère de mettre en place des jeux de paramètres Powershell pour vos trois situations. Il y a un certain nombre de billets de blog qui discutent du concept, mais vous pouvez aussi voir TechNet ou run help about_Functions_Advanced_Parameters à l'intérieur de Powershell.

30
répondu ajk 2013-03-29 00:41:10

les copies suivantes juste la structure du dossier forme ProdData à TestData sans aucun dossier

$from = "C:\ProdData"
$to = "C:\TestData"

Get-ChildItem -Path $from -Recurse | 
?{ $_.PSIsContainer } | 
Copy-Item -Destination {Join-Path $to $_.Parent.FullName.Substring($from.length)} -Force 
1
répondu Fred B 2018-01-10 22:43:27

je propose ma solution:

$source = "C:\temp\"
$dest = "C:\TestData\"

#create destination directory if dont exist
New-Item -ItemType Directory $dest -Force


#To copy everything in a folder hierarchie
Get-ChildItem $source -Recurse | Copy-Item -Destination {$_.FullName.Replace($source, $dest)}  -Force

#To copy only directory hierarchie:
Get-ChildItem $source -Recurse -directory | Copy-Item -Destination {$_.FullName.Replace($source, $dest)}  -Force

#To copy only file (remove doublon be carefull):
Get-ChildItem $source -Recurse -file | Copy-Item -Destination $dest -Force
0
répondu Esperento57 2018-06-13 03:44:48