Pisanie skryptu PowerShell do kopiowania plików z pewnym rozszerzeniem z jednego folderu do drugiego

10

Chciałbym napisać skrypt PowerShell, który pobiera następujące dane wejściowe:
Folder do kopiowania, rozszerzenia umożliwiają, folder do kopiowania i wartość logiczna wskazująca, czy zmiana powinna zrestartować IIS, nazwę użytkownika i hasło.
Na jakie polecenia cmdlet powinienem patrzeć, biorąc pod uwagę, że kopiuję na zdalny serwer?
Jak odczytać parametry do zmiennych?
Jak zrestartować IIS?

Biorąc pod uwagę, że mogę chcieć skopiować wiele folderów, jak napisać skrypt PowerShell, który wywołuje skrypt PowerShell?

the_drow
źródło
Wow, przepraszam za opóźnienie w jakiejkolwiek odpowiedzi ... Czy nadal potrzebujesz pomocy?
Marco Shaw,
Tak, tak naprawdę nie wiem jak zrestartować IIS? Jak upewnić się, że pliki są naprawdę kopiowane?
the_drow

Odpowiedzi:

22

Get-ChildItempozwala wyświetlić listę plików i katalogów, w tym rekurencyjnie z filtrami nazw plików. Copy-Itempozwala skopiować plik.

Istnieje wiele nakładek w zakresie wybierania plików, często Copy-Itemsamo w sobie jest wystarczające w zależności od szczegółów tego, czego potrzebujesz (np. Czy chcesz zachować strukturę folderów?)

Aby skopiować wszystko *.fooi *.barz StartFolder do DestFolder:

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

Jeśli chcesz zachować strukturę folderów, sprawy stają się trudniejsze, ponieważ musisz zbudować nazwę folderu docelowego, na przykład:

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

Ale robocopyprawdopodobnie będzie łatwiej:

robocopy StartFolder DestFolder *.foo *.bar /s

Ostatecznie sposób wyboru zależy od szczegółów tego, co jest potrzebne.

(W powyższym unikałem aliasów (np. Copy-ItemZamiast copy) i jawnie używam nazw parametrów, nawet jeśli są one pozycyjne.)

Richard
źródło
2
Nie działa, próbowałem: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"z powtórzeniem i bez - nic się nie dzieje
Carmageddon
6

Nie mogę zająć się częścią IIS, ale kopiowanie pliku przy zachowaniu struktury katalogów może być o wiele prostsze niż pokazano w innych odpowiedziach:

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

-ContainerArgumentem jest magia część, która będzie replikować struktury w celu turystycznym, jak to jest w źródle.

Mark Meuer
źródło
Nie jestem w stanie zmusić tego do pracy -Include... chociaż mogę go zmusić do skopiowania wszystkiego bez-Include
Ben Polinsky
1

Jedynym rozwiązaniem, które dla mnie zadziałało, jest

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

Inne rozwiązania wykorzystujące -Includeparametr nie działały.

Rustem Zinnatullin
źródło
1

Jak niektórzy wspominali tutaj -Include nie działa.

Aby działać z zagnieżdżonymi folderami, zastosowałem dwa kroki: „filtruj” + usuń puste foldery

#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 
Zwycięzca
źródło