Робота з файловою системою та оболонкою Windows за допомогою PowerShell є ключовим навиком для кожного, хто працює у сфері ІТ та кібербезпеки. PowerShell – це потужний інструмент командного рядка та скриптової мови, розроблений Microsoft, який дозволяє автоматизувати складні задачі та управляти конфігураціями. Використання PowerShell для роботи з файловою системою включає створення, видалення, зміну файлів та директорій, а також пошук та фільтрацію даних. Цей інструмент також дозволяє виконувати складні операції з системними ресурсами, такими як реєстр Windows, запуск і управління процесами та службами.
Знання PowerShell є важливим для розуміння внутрішньої роботи Windows, автоматизації рутинних завдань та підвищення ефективності роботи. У цій статті ми розглядаємо основи роботи з PowerShell, надаємо корисні команди для роботи з файловою системою та оболонкою, а також практичні поради для використання PowerShell у повсякденній роботі. У цій статті ви знайдете все необхідне для ефективної роботи з файловою системою та оболонкою Windows за допомогою PowerShell. Ми розкриваємо основи PowerShell, показуємо, як автоматизувати рутинні задачі, та ділимося практичними порадами та корисними командами. Ця інформація допоможе вам підвищити ефективність вашої роботи та розширити ваші навички управління системою Windows.
Всі люди, які працюють з комп’ютерами, щодня здійснюють безліч звернень до файлової системи, читаючи і зберігаючи файли, створюючи каталоги, копіюючи файли з одного місця в інше і так далі.
ЗАУВАЖЕННЯ. Не забувайте використовувати доповнення до файлів і каталогів під час роботи з командним рядком. Вам не потрібно вводити всі довгі шляхи — просто введіть перші символи, натисніть клавішу <Ta>, і оболонка підставить відповідний шлях у файловій системі. Давайте розглянемо найпоширеніші операції при роботі з файлами і каталогами.
У командних оболонках cmd.exe і bash ви можете переміщатися по каталогах за допомогою команди cd. У PowerShell команда cd має те саме значення, але вона є псевдонімом за замовчуванням для командлета Set-Location. Наприклад, наступна команда робить поточний каталог C:\Windows:
PS С:\> cd C:\WINDOWS PS C:\WINDOWS>
Як і у випадку з оболонкою cmd.exe, ви можете вказати .. (для переходу до батьківського каталогу) і \ (для переходу до кореневого каталогу поточного диска). Наприклад:
PS C:\WINDOWS> cd \ PS С:\>
Нагадаємо, що в оболонці cmd.exe список файлів і каталогів формується за допомогою внутрішньої команди dir, яка має безліч ключів, що дозволяють, наприклад, виводити тільки файли з певними атрибутами, обробляти вкладені підкаталоги, сортувати список за різними полями і т.д.
У PowerShell ви також можете використовувати команду dir, яка тут є псевдонімом командлета Get-Chi1dItem. Якщо виконати цю команду без параметрів, то відобразиться вміст поточного каталогу:
Каталог: С:\ Mode LastWriteTime Length Name d---- 03.03.2021 19:02 Far3x64 d---- 29.08.2020 22:01 Intel d---- 13.05.2021 21:38 MRSU d---- 07.12.2019 12:14 PerfLogs
Символи узагальнення можна використовувати в шляху, указаному для команди dir. Наприклад, наступна команда виведе всі файли журналу з каталогу C:\Windows:
PS С:\> dir C:\WINDOWSV.log Каталог: C:\WINDOWS Mode LastWriteTime Length Name —a--- 28.09.2020 16:16 762 comsetup.log -a--- 07.12.2019 12:17 776 Dtclnstall.log -a--- 26.05.2021 3:20 63456 PFRO.log -a--- 11.05.2021 22:03 623 setupact.log -a--- 28.09.2020 16:13 0 setuperr.log -a--- 04.06.2021 16:14 276 WindowsUpdate.log
Параметр -Exc1ude дозволяє вказати маску файлів, які не будуть оброблені командою dir. Наприклад, наступна команда виведе всі файли журналу з каталогу C:\Windows, за винятком тих, чиї імена починаються з літери d:
PS С: \> dir С: \WINDCWS\* . log -exclude d* . log Каталог: C:\WINDOWS Mode LastWriteTime Length Name -a--- 28.09.2020 16:16 762 comsetup.log -a--- 26.05.2021 3:20 63456 PFRO.log -a--- 11.05.2021 22:03 623 setupact.log -a--- 28.09.2020 16:13 0 setuperr.log -a--- 04.06.2021 16:14 276 WindowsUpdate
Параметр -Name дозволяє виводити на екран лише імена файлів, наприклад:
PS С:\> dir C:\WINDCWSV.log -Name comsеtup.log Dtclnstall.log PFRO.log setupact.log setuperr.log WindowsUpdate.log
Параметр -Recurse вмикає режим рекурсії, у якому команда dir діє не лише над вмістом вказаного каталогу, але й над усіма його підкаталогами:
PS С:\> dir .\Users\ -Recurse Каталог: С:\Users Mode LastWriteTime Length Name d---- 31.05.2021 7:04 andrv d-r- 28.09.2020 16:06 Public Каталог : C:\Users\andrv Mode LastWriteTime Length Name d---- 15.02.2021 20:30 .config d---- 10.10.2020 22:02 .dbus-keyrings d---- 11.02.2021 16:12 .local
За замовчуванням командлет dir не «бачить» приховані файли. Якщо ви хочете включити такі файли tayuke до списку, вам потрібно вказати параметр -Force:
Каталог: С:\ Mode LastWriteTime Length Name d—hs- 01.10.2020 14:17 $Recycle.Bin d—h— 28.09.2020 4:27 $WinREAgent d—hsl 29.08.2020 21:52 Documents and Settings d---- 03.03.2021 19:02 Far3x64 d---- 29.08.2020 22:01 Intel
У прихованих файлів у списку атрибутів (властивість Mode) є літера h (атрибут Hidden). Іноді буває потрібно сформувати список, що складається лише з підкаталогів або лише з файлів. Для цього служать ключі -Directory та -File відповідно. Наприклад:
PS С:\> dir 'C:\program files\Windows Defender\' -Directory Каталог: C:\program filesWindows Defender Mode LastWriteTime Length Name d---- 20.12.2020 22:19 en-US d---- 20.12.2020 22:19 Offline d---- 28.09.2020 16:18 platform d---- 12.05.2021 21:23 ru-RU PS C:\> dir 'C:\program files\Windows Defender\' -File Каталог: C:\program files\Windows Defender Mode LastWriteTime Length Name -a--- 07.12.2019 12:08 9398 AmMonitoringlnstall.mof -a--- 23.01.2021 8:51 204624 AMMonitoringProvider.dll -a--- 07.12.2019 12:08 21004 AmStatusInstall.mof -a--- 07.12.2019 12:08 2460 ClientWMIInstall.mof -a--- 07.12.2019 12:08 318776 ConfigSecurityPolicy.exe -a--- 07.12.2019 12:08 210872 DefenderCSP.dll -a--- 07.12.2019 12:08 733200 EppManifest.dll -a--- 07.12.2019 12:08 361 FepUnregister.mof
Список об’єктів файлової системи, створених каталогом, можна сортувати за будь-яким полем за допомогою конвеєра з командлетом Sort-Object. Наприклад, наступна команда виведе список усіх файлів і каталогів на диску C:\, відсортованих у зворотному порядку за часом доступу до них:
PS С:\> dir | Sort-Object -descending LastWriteTime Каталог: C:\ Mode LastWriteTime Length Name d---- 13.05.2021 21:38 MRSU d---- 12.05.2021 21:23 Windows d-r— 04.04.2021 11:19 Program Files (x86) d---- 03.04.2021 21:39 sqlite d---- 01.04.2021 19:17 projects d---- 03.03.2021 T9: 02 Far3x64 d-r— 15.02.2021 22:15 Program Files d---- 15.02.2021 16:09 Python39 d---- 11.02.2021 16:12 vifm d---- 11.02.2021 16:10 Soft d-r-- 01.10.2020 14:19 Users d---- 29.08.2020 22:01 Intel d---- 07.12.2019 12:14 PerfLogs
Будь-який каталог файлової системи в PowerShell відповідає об’єкту типу System. ІО. DirectoryInfo, який не має властивості, що зберігає розмір цього каталогу. Тому, щоб визначити розмір каталогу, потрібно обчислити загальний розмір файлів, записаних в цей каталог і всі його підкаталоги. Ви можете зробити це, використовуючи командлет Measure-Obj для підсумовування значень властивості Length файлових об’єктів, які передаються командлетом dir (Get-Chi1dItem).
Наприклад, наступна команда показує розмір у байтах каталогу C:\Program Files (властивість sun) і кількість файлів і підкаталогів у цьому каталозі (властивість Count):
PS С:\> dir "C:\Program Files" -Recurse | Measure-Object -Property length -Sum Count Average Sum Maximum Minimum Property 21539 2492086334 length
Якщо потрібно вказати розмір в мегабайтах або гігабайтах, то значення властивості sum слід розділити на відповідну суфіксну константу (1Mb або 1Gb):
PS С:\> (dir "C:\Program Files" -Recurse | Measure-Object -Property length -Sum) .Sum/1Mb 2376,63873100281
Як бачите, результат містить десяткові знаки. Можна округлити отримане число до двох цифр:
PS С:\> $FolderSize = (dir "C:\Program Files" -Recurse | Measure-Object -Property length -Sum) .Sum/1Mb PS C:\> [math]::round($FolderSize,2) 2376, 64
Ви можете створити новий файл або каталог у PowerShell за допомогою командлета «Новий елемент» (скорочений псевдонім ni). Шлях до елемента, який потрібно створити, вказується як значення параметра -Path, а значення параметра -ItemType вказується як “directory”, якщо ви хочете створити каталог, і “fi1e”, якщо ви хочете створити файл.
Наприклад, наступна команда створює каталог на диску C:\ з ім’ям Test:
PS С:\> New-Item -Path C:\Test -Type "directory” Каталог: C:\ Mode LastWriteTime Length Name d---- 04.06.2021 20:03 Test
Іноді потрібно створювати каталоги з актуальною датою в певному форматі. Необхідне текстове представлення дати можна отримати за допомогою параметра -ufornat командлета Get-Date. Наприклад, наступна команда створить каталог на диску C:\ з такою ж назвою, як і поточна дата у форматі ГГММДД:
PS С:\> New-Item -Path С:\ -Name "$ (Get-Date -uformat '%y%m%d')" -Type ’’directory” Каталог: C:\ Mode LastWriteTime Length Name d---- 04.06.2021 22:30 210604
Якщо в номері року потрібно вказувати чотири цифри, слід змінити специфікатор формату на ‘ %Y%m%d’:
PS С:\> New-Item -Path С:\ -Name ”$ (Get-Date -uformat ’%Y%m%d')" -Type "directory" Каталог: C:\ Mode LastWriteTime Length Name d---- 04.06.2021 22:31 20210604
При створенні файлу в нього відразу можна записати рядок, вказавши його як значення параметра -value, наприклад:
PS С:\> New-Item -Path C:\Test\test_file.txt -Type "file" -Value "Test" Каталог: C:\Test Mode -a--- LastWriteTime Length Name 04.06.2021 22:34 4 test file.txt
В якості значення параметра -Path можна вказати кілька файлів, розділених комами, всі вони будуть створені:
PS С:\Users\andrv> New-item -Path C:\Test\testl.txt, .\test2.txt, .\test3.txt Каталог: С:\Test Mode -а--- LastWriteTime 12.06.2021 6:28 Length Name 0 testl.txt Каталог: C:\Users\andrv Mode -a--- -a--- LastWriteTime 12.06.2021 6:28 12.06.2021 6:28 Length Name 0 test2.txt 0 test3.txt
Якщо спробувати створити файл з ім’ям існуючого файлу, то виникне помилка:
PS С:\> New-item -Path C:\Test\test_file.txt -Type "file” -Value "Test2" new-item : Файл "C:\Test\test_file.txt" уже существует. строка:1 знак:1 + new-item -path C:\Test\test_file.txt -type "file" -value "Test2 ... + Categoryinfo : WriteError: (C:\Test\test_file.txt:String) [New-item], IOException + FullyQualifiedErrorld : NewItemlOError,Microsoft.PowerShell.Commands. Newl temCommand Для перестворення існуючого файлу потрібно вказати параметр -Force: PS С:\> New-item -Path C:\Test\test_file.txt -Type "file" -Value "Test2" -Force Каталог: C:\Test Mode -a--- LastWriteTime Length Name 04.06.2021 22:37 5 test file.txt
Параметр -Force також допомагає в тому випадку, коли нам потрібно створити файл у каталозі, який ще не існує. За промовчанням без цього параметра в цьому випадку виникне помилка. Наприклад, спробуємо створити файл у неіснуючому підкаталогу inner:
PS С:\Users\andrv> New-item -Path C:\Test\inner\test_file.txt New-item : He удалось найти часть пути "C:\Test\inner\test_file.txt". строка:1 знак:1 + New-Item -Path C:\Test\inner\test_file.txt + Categoryinfo : WriteError: (С:\Test\inner\test_file.txt:String) [New-Item], DirectoryNotFoundException 4- FullyQualifiedErrorld : NewItemlOError,Microsoft.PowerShell.Commands. NewItemCommand Якщо вказати параметр -Force, підкаталог inner буде створений автоматично: PS С:\Users\andrv> New-Item -Path C:\Test\inner\test_file.txt -Force Каталог: С:\Test\inner Mode -а--- LastWriteTime 12.06.2021 6:34 Length Name 0 test file.txt
В оболонці cmd.exe є команда type, яка виводить вміст текстового файлу на екран. У PowerShell команда type є псевдонімом командлета GetContent (також відомого як cat і dc), який призначений для зчитування вмісту текстового файлу рядок за рядком, повертаючи об’єкт для кожного рядка (з відображенням рядків на екрані). Наприклад:
PS С:\> Get-Content C:\WINDCWS\win.ini ; for 16-bit арр support [fonts] [extensions] [mci extensions] [files] [Mail] MAPI=1 CMCDLLNAME32=mapi32.dll CMC=1 MAPIX=1 MAPIXVER=1.0.0.1 OLEMessaging=l
Параметр -Encoding командлета Get-Content дозволяє явно вказати кодування файлу, щоб його вміст оброблявся правильно. Допустимими значеннями для цього параметра є: Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii.
За замовчуванням командлет Get-Content зчитує всі рядки з файлу; ви можете обмежити їх кількість за допомогою параметра -Tota1Count. Наприклад, наступна команда читає перші п’ять рядків з файлу C:\WINDOWS\win.ini:
PS С:\> Get-Content C:\WINDOWS\win.ini -TotalCount 5 ; for 16-bit app support [fonts] [extensions] [mci extensions] [files]
Ви можете зберегти результат командлета Get-Content у змінній і називати його масивом рядків, наприклад:
PS С:\> $f = Get-Content C:\WINDOWS\win.ini -TotalCount 5 PS C:\> $f.Length 5 PS C:\> $f[0] ; for 16-bit app support PS C:\> $f[l] [fonts]
Звичайно ж, повернутий масив рядків може бути переданий безпосередньо для обробки іншими командлетами, наприклад, для перетворення і запису в інший файл (див. наступний розділ для прикладу). Параметр -Raw дозволяє прочитати весь вміст файлу в один рядок, наприклад:
PS С:\Users\andrv> $s = Get-Content C:\WINDCWS\win.ini -Raw PS C:\Users\andrv> $s ; for 16-bit app support [fonts] [extensions] [mci extensions] [files] [Mail] MAPI=1 CMCDLLNAME32=mapi32.dll CMC-1 MAPIX=1 MAPIXVER=1.0.0.1 OLEMessaging=l PS C:\Users\andrv> $s.Length 167
У PowerShell копіювання файлів і каталогів здійснюється командлетом Soru Item, який має псевдонім Soru. У цьому випадку шлях до скопійованих файлів вказується як значення параметра -Path (цей параметр використовується за замовчуванням), а шлях до цільового каталогу, в який повинні бути скопійовані файли, вказується значенням параметра -Destination.
Наприклад, наступна команда копіює файл win.ini з каталогу C:\Windows в каталог C:\Test:
PS С:\Users\andrv> New-Item С:\Script\l.psi, C:\Script\2.psl, C:\Script\ 3.txt -Force Mode LastWriteTime Length Name -а--- 11.06.2021 23:23 0 l.psl -а--- 11.06.2021 23:23 0 2.psi -а--- 11.06.2021 23:23 0 3.txt
Тепер скопіюємо каталог C:\Script в C:\Test:
PS С:\Users\andrv> сору C:\Script -Destination C:\Test -PassThru Каталог: C:\Test Mode LastWriteTime Length Name d----- 11.06.2021 23:25 Script
Як бачимо, скопіювався тільки сам каталог без файлів, що в ньому знаходяться.
Копіювати вміст вкладених каталогів дозволяє параметр -Recurse, наприклад:
PS С:\Users\andrv> copy C:\Script -Destination C:\Test -Recurse -PassThru Каталог: C:\Test\Script Mode LastWriteTime Length Name -а--- 11.06.2021 23:25 0 l.psl -а--- 11.06.2021 23:25 0 2.psi -а--- 11.06.2021 23:25 0 3.txt
Копіювати з каталогу можна не всі файли, а тільки ті, які відповідають тій чи іншій масці. У цьому випадку маску можна вказати всередині шляху, який потрібно скопіювати, або як значення параметра -Inc1ude. Наприклад, наступна команда копіює всі файли з розширенням psl з каталогу C:\Script в папку C:\Test:
PS С:\Users\andrv> сору С:\Script\*.psi -Destination C:\Test -PassThru Каталог: C:\Test Mode LastWriteTime Length Name -a--- 11.06.2021 23:25 -a--- 11.06.2021 23:25 0 l.psl 0 2.psi
Однак, якщо ви хочете скопіювати файли за маскою з усіх вкладених підкаталогів, ви не зможете використовувати один командлет «Копіювати елемент». Попередньо потрібні файли мають бути позначені командлетом Get-Chi1dItem (dir), а потім передані до командлета Копіювати елемент.
Наприклад, створимо два файли в підкаталогах Posh і Misc:
PS С:\Users\andrv> New-Item C:\Script\Posh\4.ps!, C:\Script\Misc\5.ps! -Force Каталог: C:\Script\Posh Mode -a--- LastWriteTime 12.06.2021 6:39 Length Name 0 4.psi Каталог: C:\Script\Misc Mode LastWriteTime Length Name -a--- 12.06.2021 6:39 0 5.psi
Наступна команда копіює всі файли з розширенням psl з каталогу C:\Script і всіх його підкаталогів в папку C:\Test:
PS С:\Users\andrv> dir -Recurse -Include *.psl C:\script\* | copy -Destination C:\Test -PassThru Каталог: C:\Test Mode LastWriteTime Length Name -а--- 12.06.2021 6:39 0 5.psi -а--- 12.06.2021 6:39 0 4.psi -а--- 11.06.2021 23:20 0 l.psl -а--- 11.06.2021 23:20 0 2.psi
Команда cmd.exe shell soru дозволяла об’єднувати кілька файлів разом (конкатенація файлів). У PowerShell ви можете об’єднувати файли, використовуючи командлет Get-Content (тип псевдоніма) і перенаправляючи вихідні дані на отриманий файл. Розглянемо приклад. Створимо файли C:\Test\l .txt та C:\Test\2.txt:
PS С:\Users\andrv> New-Item -Path C:\Test\l.txt -Type "file" -Value "File 1" Каталог: C:\Test Mode -a--- LastWriteTime 12.06.2021 6:56 Length Name 6 l.txt PS C:\Users\andrv> New-Item -Path C:\Test\2.txt -Type "file" -Value "File 2" Каталог: C:\Test Mode -a--- LastWriteTime 12.06.2021 6:56 Length Name 6 2.txt Наступна команда поєднує файли l.txt и 2.txt в файл 3.txt: PS С:\Users\andrv> type C:\Test\l.txt, C:\Test\2.txt > C:\Test\3.txt Проверим содержимое файла 3.txt: PS С:\Users\andrv> type C:\Test\3.txt File 1 File 2
Як бачите, об’єднання файлів 1.txt і 2.txt пройшло успішно.
Ви можете перейменувати файл або каталог за допомогою командлета Rename-Item (псевдонім ren). Значення параметра -Path цього командлета визначає шлях до елементів, які потрібно перейменувати, а значення параметра -NewName визначає нове ім’я. Назви цих параметрів можна опустити (в цьому випадку спочатку потрібно вказати значення параметра -Path). Наприклад, давайте створимо файл .tmp і перейменуємо його на файл 2.tmp:
PS С:\Users\andrv> New-item -Path C:\Test\l.tnq? Каталог: C:\Test Mode -a--- LastWriteTime 12.06.2021 7:01 Length Name 0 1. tmp PS C:\Users\andrv> ren C:\Test\l.tmp 2.tmp
Щоб побачити результат командлета Rename-Item, потрібно вказати параметр -PassThru:
PS С:\Users\andrv> ren C:\Test\2.tinp 3.tmp -PassThru Каталог: C:\Test Mode -a--- LastWriteTime 12.06.2021 7:01 Length Name 0 3.tmp
Командлет Renane-Item дозволяє перейменовувати файли або каталоги тільки в тому каталозі, в якому знаходився вихідний об’єкт. Якщо потрібно перемістити файл або каталог до іншої папки, скористайтеся командлетом «Перейменувати» (псевдонім перейменування). Значення параметра -Path цього командлета визначає шлях до файлів або каталогів, до яких потрібно перемістити (символи узагальнення дозволені в цьому шляху), а значення параметра -Destination визначає шлях до каталогу, куди будуть переміщені файли або каталоги.
Результат переміщення можна побачити на екрані, вказавши параметр -PassThru. Наприклад, наступна команда переміщує каталог C:\Test\inner з усім його вмістом до кореневого каталогу диска C:\:
PS С:\Users\andrv> Move-Item -Path C:\Test\inner С:\ -PassThru Каталог: С:\ Mode LastWriteTime Length Name d---- 12.06.2021 6:34 inner
Давайте повернемо внутрішню директорію на місце:
PS C:\Users\andrv> Move-Item -Path C:\inner C:\Test -PassThru Каталог: C:\Test Mode LastWriteTime Length Name d---- 12.06.2021 6:34 inner
Ви можете вилучити об’єкти файлової системи за допомогою командлета «Вилучити-елемент» (псевдонім de1). Значення параметра -Path командлета визначає шлях до файлів або каталогів, які потрібно видалити (ім’я параметра в команді вказувати не потрібно). У шляху дозволені символи узагальнення, а командлет «Вилучити-елемент» має параметр -Inc1ude, який визначає файли, на які вплине команда, і параметр і -Exc1ude, який визначає файли винятків, які не будуть видалені.
Наприклад, наступна команда видалить всі файли з розширенням .psl в каталозі C:\Test:
PS С:\> del С:\Test\*.psi
При спробі видалити всі файли в каталозі, в якому є підкаталоги, система видасть попередження:
PS С:\Users\andrv> del C:\Test\*
Щоб видалити всі елементи в каталозі без попередження, включаючи підкаталоги, вкажіть параметр -Recurse:
PS С:\> del C:\Test\* -Recurse
В принципі, щоб знайти текст у файлі, можна прочитати його вміст у масив рядків за допомогою командлета Get-Content і застосувати до нього один з операторів порівняння. Однак PowerShell має командлет під назвою Se1ectString, який спеціально розроблений для пошуку рядків тексту в одному або декількох файлах (подібно до консольної утиліти findstr для Windows і grep для UNIX).
Наприклад, наведена нижче команда шукає слово «Помилка» у всіх файлах журналу в системному каталозі Windows (назви параметрів -Pattern і -Path можна пропустити, пам’ятаючи, що шаблон пошуку має бути першим після назви командлета):
PS С:\Users\andrv> Select-String -Pattern Error -Path $env:windir\*.log C:\WINDOWS\DtcInstall.log:1:12-07-2019 09:17 : DTC Install error = 0, Enter MsDtcAdvancedlnstaller::Configure, base\wcp \plugins\msdtc\msdtcadvancedinstaller\msdtcadvancedinstaller.cpp (367) C:\WINDOWS\DtcInstall.log:2:12-07-2019 09:17 : DTC Install error = 0, Action: None, base\wcp\plugins\msdtc\msdtcadvance dinstaller\msdtcadvancedinstaller.cpp (396)
Як бачимо, за замовчуванням відображається шлях до файлу, що перевіряється, номер рядка, в якому було знайдено збіг, і сам рядок. рядок. По суті, результатом пошуку є об’єкт типу Microsoft. PowerShe11. . MatchInfo, який містить такі властивості: Path (шлях до файлу), Pattern (пошук за шаблоном), LineNumber (номер знайденого рядка у файлі), Line (вміст знайденого рядка) та інші:
PS С:\Users\andrv> Select-String Error $env:windir\*.log | Format-List *
IgnoreCase : True
LineNumber : 1
Line : 12-07-2019 09:17 : DTC Install error = 0, Enter
MsDtcAdvancedlnstaller::Configure, base\wcp\plugins\msdtc\
msdtcadvancedinstaller\msdtcadvancedinstaller.cpp (367)
Filename : Dtclnstall.log
Path : C:\WINDOWS\DtcInstall.log
Pattern : Error
Context :
Matches : {0}
IgnoreCase : True
LineNumber : 2
Line
Filename
Path
Pattern
Context
Matches
: <12-07-2019 09:17 : DTC Install error = 0, Action: None,
base\wcp\plugins\msdtc\msdtcadvancedinstaller\msdt
cadvancedinstaller.cpp (396)
: Dtclnstall.log
: C:\WINDOWS\DtcInstall.log
: Error
: {0}
Нагадаємо, що текст в рядках замінюється оператором -rep1ace, який підтримує регулярні вирази (див. Главу 8). Тому, щоб замінити текст у файлі, ви можете прочитати його вміст у масив рядків за допомогою командлета Get-Content, обробити необхідні рядки оператором -rep1ace та зберегти результат у той самий або інший файл за допомогою командлета Set-Content.
Розглянемо простий приклад. Створимо файл C:\Test\test.txt з трьох рядків:
PS С:\> "11111", "2222", "33333" > C:\Test\test.txt PS С:\> type C:\Test\test.txt 11111 2222 33333
Тепер давайте замінимо всі символи “1” в цьому файлі на “a”:
PS С:\> (Get-Content C:\Test\test.txt) | ForEach-Object {$_ -replace "1”, "а”} |
Set-Content С:\Test\test.txt
Перша команда в конвеєрі тут використовується в дужках, щоб командлет SetContent не починав працювати, доки командлет Get-Content не прочитає файл повністю (інакше ви можете зіткнутися з помилкою під час доступу до файлу C:\Test\test.txt одночасно під час читання та запису). Переконаємося, що заміна пройшла успішно:
PS С:\> type C:\Test\test.txt ааааа 2222 33333
Ярлики в Windows – це особливий тип файлів, які мають розширення .lnk або url і служать покажчиками на інші об’єкти (файли, каталоги, веб-ресурси, додатки, команди). PowerShell не має окремого вбудованого командлета для роботи з ярликами, але ви можете створити ярлик за допомогою зовнішніх методів об’єктів COM, доступних в операційній системі.
Наприклад, ми створимо на робочому столі активного користувача ярлик PSHome.lnk для папки, в якій встановлено оболонку PowerShell. Перше завдання – визначити шлях до робочого столу поточного користувача. Для цього ми скористаємося колекцією SpecialFolders, зберігши посилання на неї в перемінній $folders:
PS С:\> $folders = $shell.SpecialFolders PS C:\> $folders C:\Users\Public\Desktop C:\ProgramData\Microsoft\Windows\Start Menu C:\ProgramData\Microsoft\Windows\Start Menu\Programs C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp C:\Users\andrv\0neDrive\Pa6o4wn стол C:\Users\andrv\AppData\Roaming C:\Users\andrv\AppData\Roaming\Microsoft\Windows\Printer Shortcuts C:\Users\andrv\AppData\Roaming\Microsoft\Windows\Templates C:\Windows\Fonts C:\Users\andrv\AppData\Roaming\Microsoft\Windows\Network Shortcuts C:\Users\andrv\0neDrive\Pa6o4wn стол C:\Users\andrv\AppData\Roaming\Microsoft\Windows\Start Menu C:\Users\andrv\AppData\Roaming\Microsoft\Windows\SendTo C:\Users\andrv\AppData\Roaming\Microsoft\Windows\Recent C:\Users\andrv\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup C:\Users\andrv\Favorites C:\Users\andrv\OneDrive\Documents C:\Users\andrv\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Шлях до робочого столу користувача збережемо у змінній $desktop:
PS С:\> $desktop = $folders.Item('desktop')
PS C:\> $desktop
C:\Users\andrv\0neDrive\Pa6o4Mn стол
Для створення ярлика на робочому столі викличемо метод Createshortcut, передавши в нього шлях до ярлика (нагадаємо, що всередині рядка в подвійних лапках ім’я змінної замінюється на її значення):
PS С:\> $lnk = $shell.CreateShortcut("$desktop\PSHome.lnk")
PS C:\> $lnk = $Shell.Createshortcut("$Home\Рабочий стол\PSHome.Ink")
Подивимося, які властивості та методи має об’єкт, збережений у змінній $ink:
PS С:\> $lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-lcf0-lld0-adb9-00c04fd58a0b}
Name MemberType Definition
Load Method
Save Method
Arguments Property
Description Property
FullName Property
Hotkey Property
IconLocation Property
RelativePath Property
TargetPath Property
Windowstyle Property
WorkingDirectory Property
void Load (string)
void Save ()
string Arguments () {get} {set}
string Description () {get} {set}
string FullName () {get}
string Hotkey () {get} {set}
string IconLocation () {get} {set}
string RelativePath () {set}
string TargetPath () {get} {set}
int Windowstyle () {get} {set}
string WorkingDirectory () {get} {set}
Щоб створити ярлик для папки, просто збережіть шлях до папки у властивості TargetPath і викличте метод Save для збереження ярлика. Шлях до домашньої папки PowerShell зберігається в спеціальній змінній $PSHome, тому виконайте наступні команди:
PS С:\> $Ink.TargetPath = $₽SHome PS C:\> $Ink. Save ()
Проблема вирішена, і ярлик на робочий стіл активного користувача створений.
Ярлики (файли з розширенням Ink) є важливою частиною графічного інтерфейсу Windows. Однак якщо об’єкт, на який посилається ярлик, видалити або перемістити, відповідний ярлик стане марним. Давайте розберемо команди, за допомогою яких можна знайти та видалити такі некоректні ярлики на робочому столі. Як і в попередньому розділі, створимо екземпляр класу wscript. shell (змінна $sheii):
PS С:\> $shell = New-Object -ComObject WScript.Shell
У змінну $desktop помістимо шлях до робочого столу активного користувача:
PS С:\> $folders = $shell.SpecialFolders
PS C:\> $desktop = $folders.Item ("desktop")
Тепер, використовуючи конвеєр командлетів dir (Get-Chi1dItem) і ForEach-Object, перебираємо всі файли на робочому столі з розширенням lnk. Для кожного такого файлу ми будемо використовувати метод CreateShortcut для створення відповідного об’єкта ярлика та використовувати командлет Test-Path для перевірки існування об’єкта, на який посилається цей ярлик (шлях до цього об’єкта зберігається у властивості TargetPath об’єкта швидкого доступу). Якщо об’єкта не існує (командлет Test-Path повертає Fa1se), файл, що перевіряється, з розширенням lnk видаляється:
PS С:\> dir "$desktop\*.Ink" | ForEach-Object{
>> $shortcut = $shell. CreateShortcut ($_.FullName) ;
» if (-not (Test-Path $shortcut.TargetPath)) (del $_. FullName};
» }
»
У PowerShell є командлети для виконання стандартних операцій над файлами та каталогами.
Для створення файлів-ярликів та керування ними можна використовувати СОМ об’єкт wscript.shell. Працювати з COM-об’єктами дозволяє командлет New Object З параметром ComObject.
Дякуємо нашій команді волонтерів за надану інформацію з відкритих джерел.