PowerShell “copy” script

Автор | 28.04.2023

Як запустити powershell .ps1 скрипт

Невеликий скрипт powershell для власних потреб, але може згодиться комусь як частина проекту.

А тут мій скрипт на Bash з описом

Запуск script .ps1

Для початку нагадаю як взагалі запускаються скрипти powershell, варіантів декілька, я вкажу свій метод. Для початку запустим саму програму powershell. Це можно зробити через меню пуск, або через команду Run, за допомогою сполучення клавиш win + R. коли відкриється вікно run в ньому написати powershell або pwsh.exe ось так:

Потім потрібно перейти до папки (теки) в які і знаходиться ваш скрипт.

Наприклад так:

А потім і написати назву вашого скрипту в форматі: .\vash_script.ps1 десь от так як на скріншоті

Після цього вже починається “магія” 🙂 Наприклад з першого разу буде помилка виконання, тому що за замовчуванням Windows блокує виконання скриптів. Лікується таким чином:

Дозвіл на виконання непідписаних скриптів.

варіант 1 (швидкий): Запустити powershell від імені адміністратора (через меню пуск, правой клавішей вибрати “запуск від імені адміністратора” та в вікні powershell виконати команду

set-executionpolicy remotesigned

варіант 2 (повільний)

Для дозволу виконання скриптів в Windows необхідно виконати наступні кроки:

  1. Запустіть Політику безпеки локального комп’ютера. Щоб цього досягти, введіть gpedit.msc в рядок пошуку меню «Пуск» та натисніть клавішу «Enter».
  2. У лівій частині вікна відкрийте розділ «Конфігурація комп’ютера», «Налаштування Windows», «Налаштування безпеки» та оберіть «Політики об’єкту». У правій частині вікна знайдіть пункт «Обмеження виконання скриптів» та двічі клацніть на ньому.
  3. У вікні налаштувань політики виберіть «Вимкнути» та натисніть «OK».
  4. Перезапустіть комп’ютер.

Після виконання цих кроків скрипти будуть виконуватися без будь-яких обмежень. Проте, зауважте, що це може підвищити ризик безпеки вашої системи, тому виконуйте ці дії тільки у випадках, коли вам дійсно необхідно виконувати скрипти.

простий COPY скрипт, для копіювання з однієї папки в іншу.

$sourceFolder = "C:\Users\user\pwsh"  # шлях до директорії, з якої копіювати файли
$destinationFolder = "D:\pwsh" # шлях до директорії, куди копіювати файли

# Створити призначену папку, якщо вона ще не існує
if (!(Test-Path -Path $destinationFolder)) {
    New-Item -ItemType Directory -Path $destinationFolder
}

# Копіювати файли з джерела в призначення
Get-ChildItem $sourceFolder | ForEach-Object {
    if (!(Test-Path -Path "$destinationFolder\$($_.Name)")) {
        Copy-Item $_.FullName -Destination $destinationFolder
    }
}

Це простий скрипт який просто копіює з папки в папку вміст і все.

Цей скрипт спочатку перевіряє, чи існує папка призначення, і якщо вона не існує, то вона створюється за допомогою команди New-Item -ItemType Directory -Path $destinationFolder.

Потім скрипт використовує команду Get-ChildItem, щоб отримати список файлів у джерелі, і для кожного файлу він перевіряє, чи існує файл з таким же ім’ям у призначенній папці. Якщо файл не існує, то він копіюється за допомогою команди Copy-Item. Якщо файл уже існує, то він пропускається.

Ви можете змінити шляхи до джерела та призначення, якщо вони відрізняються від шляхів у прикладі.

Копіювання якщо це мережева папка та потребує авторизації

Ось приклад PowerShell-скрипта, який копіює файли з однієї папки в іншу папку, з урахуванням мережевої папки, яка вимагає авторизації:

$sourceFolder = "C:\path\to\source\folder"
$destinationFolder = "C:\path\to\destination\folder"
$networkPath = "\\server\share\folder"
$username = "username"
$password = "password"

$credentials = New-Object System.Management.Automation.PSCredential ($username, (ConvertTo-SecureString $password -AsPlainText -Force))
if (!(Test-Path $destinationFolder)) { New-Item -ItemType Directory -Path $destinationFolder }

Get-ChildItem -Path $sourceFolder -Recurse | ForEach-Object {
    $destinationFile = Join-Path $destinationFolder $_.Name
    $networkFile = Join-Path $networkPath $_.Name

    if (Test-Path $destinationFile) {
        Write-Host "File $($destinationFile) already exists. Skipping."
    } else {
        try {
            Copy-Item -Path $networkFile -Destination $destinationFolder -Credential $credentials -ErrorAction Stop
            Write-Host "Copied file $($networkFile) to $($destinationFile)."
        } catch {
            Write-Host "Error copying file $($networkFile): $($_.Exception.Message)"
        }
    }
}

У цьому скрипті ви можете замінити $sourceFolder та $destinationFolder на потрібні шляхи до відповідних папок на вашому комп’ютері. $networkPath – це шлях до мережевої папки, яку ви хочете скопіювати. Замість $username та $password вкажіть свої облікові дані для авторизації на мережевій папці.

Скрипт перевіряє, чи існує файл у папці призначення перед копіюванням. Якщо файл вже існує, він буде пропущений. Якщо файл не існує, він буде скопійований з мережевої папки у папку призначення з допомогою Copy-Item. Якщо виникає помилка під час копіювання, скрипт виводить повідомлення про помилку.

Потрібно зашифрувати параметри $password

Так, можна зашифрувати параметри $password, щоб уникнути їх витоку при використанні скрипту на неповідомих пристроях. Для цього можна використовувати функції шифрування в PowerShell, наприклад, ConvertTo-SecureString та ConvertFrom-SecureString.

Ось приклад використання:

# Запит пароля від користувача та його шифрування
$password = Read-Host "Enter password" -AsSecureString
$securePassword = ConvertFrom-SecureString $password

# Розшифрування пароля та підключення до мережевої папки
$plainPassword = ConvertTo-SecureString $securePassword
$credentials = New-Object System.Management.Automation.PSCredential ($username, $plainPassword)
New-PSDrive -Name "X" -PSProvider FileSystem -Root $path -Credential $credentials

# Копіювання файлів з папки в іншу, пропускаючи вже існуючі файли
Copy-Item -Path $source -Destination $destination -Recurse -Force -Exclude (Get-ChildItem $destination | Select-Object -ExpandProperty Name)

У цьому прикладі пароль введений користувачем зчитується та шифрується функцією ConvertTo-SecureString. Потім зашифрований пароль зберігається у змінну $securePassword. Після цього пароль можна передати як параметр скрипту, при цьому він буде зашифрований. Для розшифрування пароля використовується функція ConvertTo-SecureString, і потім з отриманого значення створюється об’єкт PSCredential, який потім використовується для підключення до мережевої папки.

Ще один приклад цього скрипту:

# запит пароля з командного рядка і збереження його в зашифрованому вигляді
$securedPassword = Read-Host "Enter the password" -AsSecureString | ConvertFrom-SecureString

# розшифровка пароля для використання у скрипті
$password = [System.Net.NetworkCredential]::new("", (ConvertTo-SecureString $securedPassword)) | Select-Object -ExpandProperty Password

# авторизація на мережевій папці
$credential = New-Object System.Management.Automation.PSCredential ($username, $securedPassword)
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive($driveLetter, $networkPath, $false, $credential.UserName, $password)

# копіювання файлів
Copy-Item $sourcePath\* $destinationPath -Recurse -Force

# відключення мережевої папки
$net.RemoveNetworkDrive($driveLetter)

У цьому скрипті ми спочатку запитуємо пароль з командного рядка і зберігаємо його у зашифрованому вигляді. Потім розшифровуємо пароль для використання у скрипті. Далі ми авторизуємось на мережевій папці з використанням імені користувача та розшифрованого пароля. Після цього копіюємо файли і відключаємо мережеву папку.

Таким чином, ви можете запустити цей скрипт один раз, і він автоматично авторизується на мережевій папці, копіює файли і відключається, все це у безпечному режимі.

Основні правила написання скриптів в PowerShell Script

  1. Використовуйте правильну синтаксичну структуру: скрипти повинні починатися з блоку коментарів, який пояснює, що робить скрипт, включаючи назву, версію та автора. Потім слід імпортувати будь-які модулі або бібліотеки, які можуть бути потрібні для виконання скрипту.
  2. Використовуйте змінні: змінні допомагають зробити ваш код більш зрозумілим та зручним для редагування та налагодження. Використовуйте описові імена для змінних, щоб зрозуміти, яку інформацію вони зберігають.
  3. Використовуйте функції: функції дозволяють розділити код на більш маленькі частини, що полегшує редагування та налагодження. Використовуйте описові імена для функцій, щоб зрозуміти, що вони роблять.
  4. Використовуйте коментарі: коментарі дозволяють описати, що робить код та як він працює. Використовуйте коментарі, щоб пояснити складні частини коду та документувати вхідні параметри та вихідні дані.
  5. Використовуйте обробку помилок: обробка помилок дозволяє попередити виникнення помилок в коді та повідомляти про них користувачеві. Використовуйте оператор try/catch, щоб перехоплювати помилки та обробляти їх.
  6. Використовуйте стандарти відступів: відступи допомагають зробити код більш зрозумілим та зручним для читання. Використовуйте стандартні відступи, наприклад, чотири пробіли на кожен рівень вкладеності.

3 коментарі до “PowerShell “copy” script

  1. zoritoler imol

    Very nice post. I just stumbled upon your weblog and wished to say that I have really enjoyed browsing your blog posts. After all I’ll be subscribing to your feed and I hope you write again soon!

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *