Écriture d'un script PowerShell pour copier des fichiers avec une certaine extension d'un dossier à un autre

10

Je voudrais écrire un script PowerShell qui obtient les paramètres suivants en entrée:
dossier à copier, extensions autorisées, dossier à copier et un booléen indiquant si la modification doit redémarrer IIS, nom d'utilisateur et mot de passe.
Quelles applets de commande dois-je envisager étant donné que je copie sur un serveur distant?
Comment lire les paramètres en variables?
Comment redémarrer IIS?

En pensant que je pourrais vouloir copier plusieurs dossiers, comment puis-je écrire un script PowerShell qui invoque un script PowerShell?

the_drow
la source
Wow, désolé pour un retard dans toute réponse ... Avez-vous encore besoin d'aide?
Marco Shaw
Oui, je ne sais pas vraiment comment redémarrer IIS? Comment m'assurer que les fichiers sont vraiment copiés?
the_drow

Réponses:

22

Get-ChildItemvous permet de lister les fichiers et répertoires, y compris récursivement avec des filtres de nom de fichier. Copy-Itemvous permet de copier un fichier.

Il y a beaucoup de chevauchements en termes de sélection des fichiers, souvent Copy-Itemseul est suffisant en fonction des détails de ce dont vous avez besoin (par exemple. Voulez-vous conserver la structure des dossiers?)

Pour copier tout *.fooet *.barde StartFolder vers DestFolder:

Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"

Si vous devez conserver la structure du dossier, les choses deviennent plus difficiles, car vous devez créer le nom du dossier de destination, quelque chose comme:

$sourcePath = 'C:\StartFolder'
$destPath = 'C:\DestFolder'

Get-ChildItem $sourcePath -Recurse -Include '*.foo', '*.bar' | Foreach-Object `
    {
        $destDir = Split-Path ($_.FullName -Replace [regex]::Escape($sourcePath), $destPath)
        if (!(Test-Path $destDir))
        {
            New-Item -ItemType directory $destDir | Out-Null
        }
        Copy-Item $_ -Destination $destDir
    }

Mais robocopyest susceptible d'être plus facile:

robocopy StartFolder DestFolder *.foo *.bar /s

En fin de compte, la façon de choisir dépendra des détails de ce qui est nécessaire.

(Dans ce qui précède, j'ai évité les alias (par exemple Copy-Itemplutôt que copy) et j'utilise explicitement les noms de paramètres même s'ils sont positionnels.)

Richard
la source
2
Ne fonctionne pas, j'ai essayé: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"avec et sans -recurse - rien ne se passe
Carmageddon
6

Je ne peux pas traiter la partie IIS, mais la copie du fichier tout en préservant la structure du répertoire peut être beaucoup plus simple que celle indiquée dans les autres réponses:

Copy-Item -path "StartFolder" -Recurse -Include "*.foo","*.bar" -Destination "DestFolder" -Container

L' -Containerargument est la partie magique qui répliquera la structure dans la destination comme dans la source.

Mark Meuer
la source
Je n'arrive pas à faire fonctionner ça -Include... même si je peux tout copier sans-Include
Ben Polinsky
1

La seule solution qui a fonctionné pour moi est

Copy-Item -path 'c:\SourceFolder\*.foo' -destination 'c:\DestFolder'

D'autres solutions utilisant des -Includeparamètres n'ont pas fonctionné.

Rustem Zinnatullin
la source
1

Comme certaines personnes l'ont mentionné ici, l' inclusion ne fonctionne pas.

Pour le faire fonctionner avec des dossiers imbriqués, j'ai utilisé l'approche en deux étapes: «filtrer» + supprimer les dossiers vides

#copy with folder structure
Copy-Item -path $source -Recurse -Filter "*.foo" -Destination $destination -Container

#remove empty folders
dir $destination -Directory -Recurse |
    %{ $_.FullName} |
    sort -Descending |
    where { !@(ls -force $_) } |
    rm 
Victor
la source