Scrivere uno script PowerShell per copiare file con una certa estensione da una cartella all'altra


10

Vorrei scrivere uno script PowerShell che ottenga i seguenti parametri come input:
Cartella da cui copiare, estensioni consente, cartella da copiare e un valore booleano che indica se la modifica deve riavviare IIS, nome utente e password.
Quali cmdlet dovrei considerare considerando che sto copiando su un server remoto?
Come posso leggere i parametri in variabili?
Come riavvio IIS?

Considerando che potrei voler copiare più cartelle, come posso scrivere uno script PowerShell che invoca uno script PowerShell?


Wow, scusa per il ritardo nella risposta ... Hai ancora bisogno di aiuto?
Marco Shaw,

Sì, non so davvero come riavviare IIS? Come posso assicurarmi che i file siano veramente copiati?
the_drow,

Risposte:


22

Get-ChildItemconsente di elencare file e directory, anche ricorsivamente con i filtri dei nomi dei file. Copy-Itemti permette di copiare un file.

C'è molta sovrapposizione in termini di selezione dei file, spesso Copy-Itemda sola è sufficiente a seconda dei dettagli di ciò di cui hai bisogno (es. Vuoi conservare la struttura delle cartelle?)

Per copiare tutto *.fooe *.barda StartFolder a DestFolder:

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

Se è necessario preservare la struttura delle cartelle, le cose diventano più difficili perché è necessario creare il nome della cartella di destinazione, ad esempio:

$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
    }

Ma robocopyè probabile che sia più semplice:

robocopy StartFolder DestFolder *.foo *.bar /s

Alla fine il modo di scegliere dipenderà dai dettagli di ciò che è necessario.

(In precedenza ho evitato gli alias (ad es. Copy-ItemAnziché copy) e uso esplicitamente i nomi dei parametri anche se sono posizionali.)


2
Non funziona, ho provato: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"con e senza risposta - non succede nulla
Carmageddon,

6

Non riesco a indirizzare la parte IIS, ma la copia del file preservando la struttura della directory può essere molto più semplice di quella mostrata nelle altre risposte:

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

L' -Containerargomento è la parte magica che replicherà la struttura nella destinazione così come è nella fonte.


Non riesco a farlo funzionare con -Include... anche se riesco a farlo copiare tutto senza-Include
Ben Polinsky,

1

L'unica soluzione che ha funzionato per me è

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

Altre soluzioni che utilizzano i -Includeparametri non hanno funzionato.


1

Come alcune persone menzionate qui -Include non funziona.

Per farlo funzionare con le cartelle nidificate ho usato due passaggi: "filtro" + cancella le cartelle vuote

#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 

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.