Написання скрипта з повноваженнями для копіювання файлів з певним розширенням з однієї папки в іншу


10

Я хотів би написати скрипт powerhell, який отримує такі параметри як вхідні дані:
папка для копіювання, розширення дозволяє, папка для копіювання та булеве значення із зазначенням, чи слід змінити перезапуск IIS, ім'я користувача та пароль.
На які командлети я повинен дивитися, враховуючи, що я копіюю на віддалений сервер?
Як прочитати параметри на змінні?
Як перезапустити IIS?

Зважаючи на те, що я можу захотіти скопіювати декілька папок, як я можу написати сценарій оболонки повноважень, який викликає сценарій оболонки повноважень?


Нічого собі, вибачте за затримку будь-якої відповіді ... Вам все-таки потрібна допомога?
Марко Шоу

Так, я не знаю, як перезапустити 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

Як згадували деякі люди - включення не працює.

Щоб він працював з вкладеними папками, я застосував два кроки підходу: 'фільтрувати' + видаляти порожні папки

#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 

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.