Schreiben eines Powershell-Skripts zum Kopieren von Dateien mit einer bestimmten Erweiterung von einem Ordner in einen anderen

10

Ich möchte ein Powershell-Skript schreiben, das die folgenden Parameter als Eingabe erhält:
Ordner zum Kopieren, Erweiterungen zulassen , Ordner zum Kopieren und ein Boolescher Wert, der angibt, ob die Änderung IIS, Benutzername und Kennwort neu starten soll.
Welche Cmdlets sollte ich beachten, wenn ich bedenke, dass ich auf einen Remote-Server kopiere?
Wie lese ich die Parameter in Variablen ein?
Wie starte ich IIS neu?

Wie schreibe ich ein Powershell-Skript, das ein Powershell-Skript aufruft, da ich möglicherweise mehrere Ordner kopieren möchte?

the_drow
quelle
Wow, entschuldigen Sie die Verzögerung bei der Beantwortung ... Benötigen Sie noch Hilfe?
Marco Shaw
Ja, ich weiß nicht wirklich, wie ich IIS neu starten soll. Wie stelle ich sicher, dass die Dateien wirklich kopiert werden?
the_drow

Antworten:

22

Get-ChildItemErmöglicht das Auflisten von Dateien und Verzeichnissen, auch rekursiv mit Dateinamenfiltern. Copy-Itemermöglicht es Ihnen, eine Datei zu kopieren.

Es gibt viele Überschneidungen bei der Auswahl der Dateien, oft reicht dies Copy-Itemallein aus, abhängig von den Details dessen, was Sie benötigen (z. B. möchten Sie die Ordnerstruktur beibehalten?).

So kopieren Sie alle *.foound *.barvon StartFolder nach DestFolder:

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

Wenn Sie die Ordnerstruktur beibehalten müssen, wird es schwieriger, weil Sie den Namen des Zielordners erstellen müssen.

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

Ist robocopyaber wahrscheinlich einfacher:

robocopy StartFolder DestFolder *.foo *.bar /s

Am Ende hängt die Art der Auswahl von den Details ab, die benötigt werden.

(Oben habe ich Aliase vermieden (z. B. Copy-Itemanstatt copy) und explizit Parameternamen verwendet, auch wenn sie positionell sind.)

Richard
quelle
2
Funktioniert nicht, ich habe versucht: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"mit und ohne - Rückschritt - nichts passiert
Carmageddon
6

Ich kann den IIS-Teil nicht adressieren, aber die Dateikopie unter Beibehaltung der Verzeichnisstruktur kann viel einfacher sein als in den anderen Antworten gezeigt:

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

Das -ContainerArgument ist der magische Teil, der die Struktur im Ziel so repliziert, wie sie sich in der Quelle befindet.

Mark Meuer
quelle
Ich kann das nicht zum -Include-Include
Laufen bringen
1

Die einzige Lösung, die für mich funktioniert hat, ist

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

Andere Lösungen, die -IncludeParameter verwenden, haben nicht funktioniert.

Rustem Zinnatullin
quelle
0

Wie einige Leute hier erwähnt haben - Include funktioniert nicht.

Damit es mit verschachtelten Ordnern funktioniert, habe ich zwei Schritte ausgeführt: 'filtern' + leere Ordner löschen

#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 
Sieger
quelle