PowerShell “copy” script
Як запустити 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 необхідно виконати наступні кроки:
- Запустіть Політику безпеки локального комп’ютера. Щоб цього досягти, введіть gpedit.msc в рядок пошуку меню «Пуск» та натисніть клавішу «Enter».
- У лівій частині вікна відкрийте розділ «Конфігурація комп’ютера», «Налаштування Windows», «Налаштування безпеки» та оберіть «Політики об’єкту». У правій частині вікна знайдіть пункт «Обмеження виконання скриптів» та двічі клацніть на ньому.
- У вікні налаштувань політики виберіть «Вимкнути» та натисніть «OK».
- Перезапустіть комп’ютер.
Після виконання цих кроків скрипти будуть виконуватися без будь-яких обмежень. Проте, зауважте, що це може підвищити ризик безпеки вашої системи, тому виконуйте ці дії тільки у випадках, коли вам дійсно необхідно виконувати скрипти.
простий 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
- Використовуйте правильну синтаксичну структуру: скрипти повинні починатися з блоку коментарів, який пояснює, що робить скрипт, включаючи назву, версію та автора. Потім слід імпортувати будь-які модулі або бібліотеки, які можуть бути потрібні для виконання скрипту.
- Використовуйте змінні: змінні допомагають зробити ваш код більш зрозумілим та зручним для редагування та налагодження. Використовуйте описові імена для змінних, щоб зрозуміти, яку інформацію вони зберігають.
- Використовуйте функції: функції дозволяють розділити код на більш маленькі частини, що полегшує редагування та налагодження. Використовуйте описові імена для функцій, щоб зрозуміти, що вони роблять.
- Використовуйте коментарі: коментарі дозволяють описати, що робить код та як він працює. Використовуйте коментарі, щоб пояснити складні частини коду та документувати вхідні параметри та вихідні дані.
- Використовуйте обробку помилок: обробка помилок дозволяє попередити виникнення помилок в коді та повідомляти про них користувачеві. Використовуйте оператор try/catch, щоб перехоплювати помилки та обробляти їх.
- Використовуйте стандарти відступів: відступи допомагають зробити код більш зрозумілим та зручним для читання. Використовуйте стандартні відступи, наприклад, чотири пробіли на кожен рівень вкладеності.