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

10

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

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

the_drow
источник
Ничего себе, извините за задержку в любом ответе ... Вам все еще нужна помощь?
Марко Шоу
Да, я не знаю, как перезапустить IIS? Как мне убедиться, что файлы действительно скопированы?
the_drow

Ответы:

22

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) и явно использовал имена параметров, даже если они позиционные.)

Ричард
источник
2
Не работает, я пытался: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"с и без - возместить - ничего не происходит
Carmageddon
6

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

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

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

Марк Мейер
источник
Я не могу заставить это работать -Include... хотя я могу заставить это копировать все без-Include
Бен Полински
1

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

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

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

Рустем Зиннатуллин
источник
1

Как некоторые люди упоминали здесь -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 
Виктор
источник