Назад | Перейти на главную страницу

Написание сценария PowerShell для копирования файлов с определенным расширением из одной папки в другую

Я хотел бы написать сценарий PowerShell, который получает на вход следующие параметры:
Папка для копирования, расширения разрешают, папка для копирования и логическое значение, указывающее, следует ли перезапускать IIS при изменении, имя пользователя и пароль.
На какие командлеты мне следует обратить внимание, учитывая, что я копирую на удаленный сервер?
Как мне прочитать параметры в переменных?
Как перезапустить IIS?

Учитывая, что я могу захотеть скопировать несколько папок, как мне написать сценарий PowerShell, который вызывает сценарий PowerShell?

Get-ChildItem позволяет вам перечислять файлы и каталоги, в том числе рекурсивно с фильтрами имен файлов. Copy-Item позволяет копировать файл.

Есть много совпадений с точки зрения выбора файлов, часто Copy-Item Самого по себе достаточно, в зависимости от деталей того, что вам нужно (например, вы хотите сохранить структуру папок?)

Чтобы скопировать все *.foo и *.bar из StartFolder в DestFolder:

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

Если вам нужно сохранить структуру папок, все становится сложнее, потому что вам нужно создать имя целевой папки, например:

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

Но robocopy скорее всего будет проще:

robocopy StartFolder DestFolder *.foo *.bar /s

В конце концов, способ выбора будет зависеть от деталей того, что нужно.

(Выше я избегал псевдонимов (например, Copy-Item скорее, чем copy) и явно использовать имена параметров, даже если они позиционные.)

Я не могу обратиться к части IIS, но копия файла при сохранении структуры каталогов может быть намного проще, чем показано в других ответах:

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

В -Container Аргумент - это магическая часть, которая будет копировать структуру в месте назначения, как она есть в источнике.

Единственное решение, которое сработало для меня, это

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

Другие решения, использующие -Include параметр не работал.

Как некоторые люди упоминали здесь -Включают не работает.

Чтобы заставить его работать с вложенными папками, я использовал двухэтапный подход: «фильтр» + удаление пустых папок.

#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 

Если вы используете IIS7, вы можете использовать собственный компонент для репликации контента между серверами IIS: http://blog.theplanet.com/2010/05/18/mirroring-server-content-and-configuration-in-iis7/