PowerShell для управления файлами (часть 1)

Опубликовано: 18 Марта, 2023

  • PowerShell для управления файлами (часть 6)

Я начал заниматься ИТ еще во времена DOS. Для тех, кто может быть не знаком с этим термином, DOS расшифровывается как Disk Operating System. Это была полностью основанная на командной строке операционная система, которая была достаточно мала, чтобы поместиться на дискету. Задумайтесь об этом на мгновение… DOS была операционной системой командной строки, которая была специально разработана для выполнения функций, связанных с дисками (в конце концов, диск был в названии).

В DOS можно было находить файлы по различным критериям, но нужно было знать, какую команду использовать. Что интересно, Microsoft в конечном итоге добавила многие из этих команд в командную строку Windows, а затем и в PowerShell. На самом деле это означает, что хотя PowerShell всего около десяти лет, он содержит команды, оставшиеся с 1980-х годов. Плохая новость заключается в том, что некоторые из этих команд довольно архаичны и могут быть утомительными в использовании. Хорошая новость заключается в том, что по большей части эти команды существуют только для целей обратной совместимости. Microsoft создала эквиваленты PowerShell для многих старых команд DOS. Позвольте мне привести вам очень простой пример.

Во времена DOS команда, которая использовалась для отображения содержимого текущей папки, называлась DIR (сокращенно от слова «каталог»). У команды DIR было множество вариаций. Например, если вы хотите отобразить содержимое текущей папки и всех вложенных папок, вы можете добавить ключ /S. В любом случае DIR была основной командой, используемой для отображения содержимого папки или для поиска определенных файлов. Команда DIR по-прежнему работает в PowerShell, но Microsoft создала командлет PowerShell, который делает нечто подобное. Этот командлет — Get-ChildItem. Вы можете увидеть, как обе команды используются на изображении ниже.

Изображение 4607
PowerShell поддерживает как команду DIR, так и командлет Get-ChildItem.

Конечно, возникает вопрос, почему PowerShell содержит две команды, которые делают одно и то же. Я не знаю официального ответа Microsoft, но подозреваю, что это связано с согласованностью. В мире PowerShell каждый командлет имеет очень специфический формат. Командлеты состоят из глагола и существительного. В случае Get-ChildItem Get — это глагол, а ChildItem — существительное. Этот синтаксис помогает сделать командлеты PowerShell немного более интуитивно понятными, и очень приятно, что весь собственный набор командлетов придерживается жесткой структуры.

Внедрение командлетов PowerShell в качестве замены старых команд DOS также позволило провести определенную модернизацию. Microsoft может интегрировать в командлеты PowerShell функции, которых просто не существовало во времена DOS. В таком случае я подумал, что было бы интересно показать вам некоторые вещи, которые можно сделать с помощью командлета Get-ChildItem.

В предыдущем примере я ввел командлет Get-ChildItem без каких-либо переключателей командной строки, из-за чего PowerShell отобразил содержимое текущей папки. Но что, если вы хотите взглянуть на другую папку? В DOS можно было добавить путь к команде DIR (DIR C:Scripts), и вы можете сделать что-то подобное в PowerShell, используя Get-ChildItem. Однако командлет Get-ChildItem не ограничивает вас указанием одного пути. У вас есть возможность изучить несколько путей.

Предположим на мгновение, что я хочу изучить содержимое папки ISO и папки Scripts на моем сервере. Я мог просматривать обе папки одной командой. Команда, используемая для этого, будет следующей:

Вы можете увидеть, как это выглядит ниже.

Изображение 4608
PowerShell позволяет просматривать две папки одновременно.

Хорошо, это забавный маленький трюк для вечеринки, но давайте сделаем что-нибудь более полезное. Давайте представим, что на машине заканчивается место для хранения, и вы хотите получить список всех файлов размером более 1 ГБ. Есть три вещи, которые вам нужно будет сделать, чтобы достичь этого. Во-первых, вам нужно будет ввести команду таким образом, чтобы можно было искать все содержимое сервера (в отличие от ручного указания отдельных путей). Во-вторых, вам придется фильтровать вывод по размеру файла. В-третьих, вам нужно будет поместить вывод в легко читаемый формат.

Первую из этих задач действительно легко выполнить. Если вы хотите изучить все содержимое сервера, вы можете ввести командлет Get-ChildItem, а затем переключатель –Recurse. Переключатель Recurse указывает PowerShell отображать содержимое любых папок, существующих в текущей папке. Например, вы можете ввести команду следующим образом:

Поиск файлов размером более 1 ГБ также является относительно простым процессом, но вы не можете использовать переключатель Get-ChildItem для указания размера файла. Вместо этого вам придется направить выходные данные команды в командлет Where-Object, а затем использовать командлет Where-Object, чтобы указать размер целевого файла. Такая команда может выглядеть так:

Вы можете увидеть пример этого ниже.

Изображение 4609
Я смог перечислить файлы размером более 1 ГБ.

Как вы, возможно, помните, последним шагом было облегчение чтения вывода. Есть несколько причин, почему нам нужно это сделать. Прежде всего, вы заметите, что длина указана как довольно большое число. Мы можем переформатировать длину, чтобы ее было легче читать.

Другая причина, по которой нам нужно очищать вывод, заключается в том, что он показывает информацию, которая нам не нужна. Например, столбцы Mode и LastWriteTime не имеют отношения к тому, что мы делаем.

Наконец, нам нужно подавить сообщения об ошибках. Если вы посмотрите на изображение ниже, например, вы можете увидеть ошибку, связанную с папкой, на которую у меня нет прав.

Изображение 4610
Я получил сообщение об отказе в доступе.

Чтобы очистить вывод, я собираюсь использовать эту команду:

Вы можете увидеть вывод этой команды ниже.

Изображение 4611
Мы очистили вывод.

Как видно на рисунке выше, мы избавились от сообщения об ошибке и ненужных столбцов. Я использовал переключатель –ErrorAction вместе с параметром SilentlyContinue, чтобы избавиться от ошибки. Я скрыл ненужные столбцы, используя Select, а затем имена столбцов, которые я хотел отобразить. Наконец, я преобразовал байты в гигабайты, используя параметр Expression и разделив длину на 1 ГБ. В PowerShell также есть способ управления количеством отображаемых цифр, но это другая задача, о которой мы поговорим в другой раз.

Завершение

В этой статье объясняется, как Get-ChildItem используется аналогично команде DIR и как ее можно комбинировать с другими командами PowerShell. В следующей статье я хочу показать вам некоторые методы поиска файлов на основе диапазонов дат.

  • PowerShell для управления файлами (часть 6)