Я хотел бы написать сценарий 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/