1
votes

Copier l'élément exclure les sous-dossiers

Essayer d'obtenir mon élément de copie pour copier tout dans le répertoire sauf un sous-dossier. J'ai pu exclure dans le dossier et les fichiers, mais pas dans les sous-dossiers.

J'ai essayé d'utiliser get-children et le -exclude dans l'élément de copie, mais je ne les ai pas exclus comme j'espère

$exclude = "folder\common"

Get-ChildItem "c:\test" -Directory | 
    Where-Object{$_.Name -notin $exclude} | 
    Copy-Item -Destination 'C:\backup' -Recurse -Force

En espérant que le dossier commun existera mais rien ne serait une copie.

Merci pour l'aide


6 commentaires

{$ _. Name -notin $ exclude} -> {$ _. FullName -notmatch $ exclude}


J'ai essayé, mais cela n'a pas exclu le dossier commun


$ exclude doit être échappé à l'expression régulière si vous utilisez la correspondance d'expression régulière ( -match ou -notmatch ). $ exclude = [regex] :: Échapper ("dossier \ commun") ou échapper manuellement le \ avec \\.


@AdminOfThings J'ai essayé les deux et il semble que cela n'a pas exclu le dossier


Si $ exclude = "dossier", ce serait beaucoup plus facile.


Le paramètre de profondeur peut vous aider


3 Réponses :


0
votes

Voici un exemple:

$exclude= 'subfolderA'
$path = 'c:\test'

$fileslist = gci $path -Recurse

foreach ($i in 0..$fileslist){  if( -not ($i.Fullname -like "*$($exlusion)*")){ copy-item -path $i.fullname -Destination 'C:\backup'  -Force  } }


3 commentaires

Cela ne fonctionne pas pour les sous-dossiers, je souhaite exclure le dossierA \ subFolderA


Eh bien, il suffit de vérifier le dossier de tout pour le nom de fichier, mais le cas de bord peut survenir s'il doit être plus spécifique que


cela fonctionnerait pour tous les sous-dossiers des dossiers exclus car le «nom complet» contient le nom du dossier parent, donc l'exclusion.



3
votes

Je pense que cela devrait faire ce dont vous avez besoin:

$sourceFolder = 'C:\test'
$destination  = 'C:\backup'
$exclude      = @("folder\common")  # add more folders to exclude if you like

# create a regex of the folders to exclude
# each folder will be Regex Escaped and joined together with the OR symbol '|'
$notThese = ($exclude | ForEach-Object { [Regex]::Escape($_) }) -join '|'

Get-ChildItem -Path $sourceFolder -Recurse -File | 
     Where-Object{ $_.DirectoryName -notmatch $notThese } | 
     ForEach-Object {
        $target = Join-Path -Path $destination -ChildPath $_.DirectoryName.Substring($sourceFolder.Length)
        if (!(Test-Path -Path $target -PathType Container)) {
            New-Item -Path $target -ItemType Directory | Out-Null
        }
        $_ | Copy-Item -Destination $target -Force
     }

J'espère que cela vous aidera


4 commentaires

Je suis passé à .Full Name à partir de .Directory Name. Pour certains cas où je voulais un nom de fichier spécifique mais un changement mineur


Vous avez dit que vous pouviez ajouter plus de dossiers à exclure, quelle serait la syntaxe pour cela?


@ Branderson20 Ajoutez simplement des noms de dossiers ou des morceaux de chemins de dossiers au tableau $ exclude . Quelque chose comme $ exclude = "folder \ common", "folder \ notsocommon", "donttouchthisfolder"


Merci, c'était un autre problème mais l'a résolu, merci cependant



0
votes

Je pense que l'utilisation du paramètre -exclude sur Get-ChildItem fonctionnerait:

$exclude = 'Exclude this folder','Exclude this folder 2','Folder3'

Get-ChildItem -Path "Get these folders" -Exclude $exclude | Copy-Item -Destination "Send folders here"


0 commentaires