Get-Date возвращает в Powershell дату и время. С помощью этого командлета мы можем получить нужное нам значение формата Datetime, что поможет нам выполнять, например, сравнение дат.
Т.е. выполнение команды без ключей вернет нам текущую дату в powershell:
Если нам нужно получить какую-то другую дату формата Datetime, то надо установить ее с помощью этого команды:
Если мы не установим какое-то значение, например Year (год), то он возьмется текущий.
Как минусовать день в Powershell Get-Date
Получим свойства и методы этого объекта:
Все методы — это то что мы можем сделать с датой. Для примера получим дату минус один день от сегодняшнего числа:
Или прибавить дни через AddDays:
Если мы прибавим, допустим, часы больше чем в сутках, то у нас изменится и день:
Таким же образом мы можем добавлять и убирать такие элементы дат:
- AddDays — дни
- AddHours — часы
- AddMilliseconds — миллисекунды
- AddMinutes — минуты
- AddMonths — месяца
- AddSeconds — секунды
- AddYears — года
Преобразование в Powershell даты в строку и из строки
Так же как и во всех других языках мы можем преобразовать тип даты. Для того что бы преобразовать в строку у нас есть несколько методов:
- ToLongDateString — строка с днем недели и именем месяца
- ToLongTimeString — показывает часы, минуты и время
- ToShortDateString — возвращает только дату
- ToShortTimeString — вернет только часы и минуты
- ToString — вернут полную дату и время
Каждый из этих методов вызывается так:
Или на примере какой-то другой даты с переменной:
Для того что бы получить дату из строки нужно использовать ключ date:
Если мы не установим время или дату, то значение возьмется текущее:
Нужно учитывать, что формат даты в таком варианте исполнения будет тем, который установлен в системных настройках. В моем случае американский и поэтому идет месяц, день, год. Если стоит русский будет день, месяц и год. Увидеть эту настройку можно так:
Получение частей даты и времени через ключ Format в Powershell Get-Date
Возможно получить только день недели или час от времени и для этого нужно использовать Format или один из методов. Так я получу год:
Или аналогично, но уже используя свойство:
Используя Format всегда возвращается тип данных string, а не DateTime.
У нас есть еще множество свойств, кроме Year, которые мы можем получать:
Выведем день недели ( DayOfWeek):
Обратите внимание, что не всегда возвращаемый объект типа DateTime. Он может быть и численным (int) или строковым, в случае с Format.
На примере Format есть много спецификаторов:
- dddd — день недели в виде имени
- MM — номер месяца
- dd — день месяца
- yyyy — год
- HH:mm — часы и минуты
- K — Часовой пояс
- ss — секунды
Так мы выведем дату формата часы, минуты, день, месяц и год:
Обращаете внимание на регистр иначе получим другие значение.
Сравнение дат в Powershell
Выполнять сравнение дат можно в случае, если значение типа DateTime. Какого типа значение мы можем посмотреть двумя способами. При просмотра свойства объекта мы увидим какого типа он возвращает значение:
Либо у получить это значение так:
Для примера сравним в powershell даты файла. На картинке выше видно, что у каждого файла есть свойство CreationTime формата DateTime. Сравним какие файлы были созданы за последние 15 дней:
GT — говорит о том, что мы ищем значения только больше чем справа. Обо всех операторах сравнения мы говорили тут.
Мы можем сравнивать и только по дню месяца, но в случае ниже день месяца будет числом, а не датой:
Другие примеры с Powershell Get-Date
Один из интересных примеров в работе с датой это командлет New-TimeSpan, который вернет время работы сервиса или любого другого объекта, если передать ему время. Для примера так он вернет значение в минутах, секундах с установленной даты:
Применение этому можно найти, например, открытым пользователями через SMB файлам или очень долго запущенным процессам.
Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисках Windows. Navigating through Windows PowerShell drives and manipulating the items on them is similar to manipulating files and folders on Windows physical disk drives. В этом разделе мы обсудим выполнение конкретных задач по управлению файлами и папками с помощью PowerShell. This section discusses how to deal with specific file and folder manipulation tasks using PowerShell.
Получение списка файлов и папок, содержащихся в папке Listing All the Files and Folders Within a Folder
Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem. You can get all items directly within a folder by using Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Add the optional Force parameter to display hidden or system items. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows): For example, this command displays the direct contents of Windows PowerShell Drive C (which is the same as the Windows physical drive C):
Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. The command lists only the directly contained items, much like using Cmd.exe’s DIR command or ls in a UNIX shell. Для показа вложенных элементов необходимо также указать параметр -Recurse. In order to show contained items, you need to specify the -Recurse parameter as well. (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите: (This can take an extremely long time to complete.) To list everything on the C drive:
Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Get-ChildItem can filter items with its Path, Filter, Include, and Exclude parameters, but those are typically based only on name. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью командлета Where-Object. You can perform complex filtering based on other properties of items by using Where-Object.
Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт: The following command finds all executables within the Program Files folder that were last modified after October 1, 2005 and which are neither smaller than 1 megabyte nor larger than 10 megabytes:
Копирование файлов и папок Copying Files and Folders
Копирование выполняется с помощью командлета Copy-Item. Copying is done with Copy-Item. Следующая команда создает резервную копию C:oot.ini в C:oot.bak: The following command backs up C:oot.ini to C:oot.bak:
Если целевой файл уже существует, то попытка копирования завершается неудачей. If the destination file already exists, the copy attempt fails. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force. To overwrite a pre-existing destination, use the Force parameter:
Эта команда работает, даже если целевой объект доступен только для чтения. This command works even when the destination is read-only.
Так же выполняется и копирование папок. Folder copying works the same way. Эта команда рекурсивно копирует папку "C: emp est1" в новую папку "c: empDeleteMe". This command copies the folder C: emp est1 to the new folder C: empDeleteMe recursively:
Можно также скопировать избранные элементы. You can also copy a selection of items. Следующая команда копирует все файлы .txt, содержащиеся в папке "c:data", в папку "c: emp ext": The following command copies all .txt files contained anywhere in c:data to c: emp ext:
Для копирования элементов файловой системы можно использовать и другие средства. You can still use other tools to perform file system copies. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. XCOPY, ROBOCOPY, and COM objects, such as the Scripting.FileSystemObject, all work in Windows PowerShell. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:oot.ini в файле C:oot.bak: For example, you can use the Windows Script Host Scripting.FileSystem COM class to back up C:oot.ini to C:oot.bak:
Создание файлов и папок Creating Files and Folders
Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Creating new items works the same on all Windows PowerShell providers. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента. If a Windows PowerShell provider has more than one type of item—for example, the FileSystem Windows PowerShell provider distinguishes between directories and files—you need to specify the item type.
Эта команда создает папку "C: empNew Folder": This command creates a new folder C: empNew Folder:
Эта команда создает пустой файл "C: empNew Folderfile.txt": This command creates a new empty file C: empNew Folderfile.txt
Удаление всех файлов и папок, содержащихся в папке Removing All Files and Folders Within a Folder
Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. You can remove contained items using Remove-Item, but you will be prompted to confirm the removal if the item contains anything else. Например, при попытке удаления папки C: empDeleteMe, которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки: For example, if you attempt to delete the folder C: empDeleteMe that contains other items, Windows PowerShell prompts you for confirmation before deleting the folder:
Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse: If you do not want to be prompted for each contained item, specify the Recurse parameter:
Подключение локальной папки как диска Mapping a Local Folder as a drive
Подключить локальную папку можно с помощью команды New-PSDrive. You can also map a local folder, using the New-PSDrive command. Следующая команда создает локальный диск P:, корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell: The following command creates a local drive P: rooted in the local Program Files directory, visible only from the PowerShell session:
Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell. Just as with network drives, drives mapped within Windows PowerShell are immediately visible to the Windows PowerShell shell. Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist. In order to create a mapped drive visible from File Explorer, the parameter -Persist is needed. Но с этим параметром можно использовать только удаленные пути. However, only remote paths can be used with Persist.
Чтение текстового файла в массив Reading a Text File into an Array
Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. One of the more common storage formats for text data is in a file with separate lines treated as distinct data elements. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее. The Get-Content cmdlet can be used to read an entire file in one step, as shown here:
Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Get-Content already treats the data read from the file as an array, with one element per line of file content. Убедиться в этом можно, проверив свойство Length полученного содержимого: You can confirm this by checking the Length of the returned content:
Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. This command is most useful for getting lists of information into Windows PowerShell directly. Например, можно хранить в файле "C: empdomainMembers.txt" список имен компьютеров или IP-адресов по одному имени на каждую строку файла. For example, you might store a list of computer names or IP addresses in a file C: empdomainMembers.txt, with one name on each line of the file. Можно использовать командлет Get-Content, чтобы извлечь содержимое файла и поместить его в переменную $Computers: You can use Get-Content to retrieve the file contents and put them in the variable $Computers:
Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера. $Computers is now an array containing a computer name in each element.
Джеффри Хикс опубликовал очередную статью по PowerShell, посвященную на этот раз управлению файловыми серверами. Мы решили разбить ее на две части: построение отчетов по файловому серверу и непосредственно управление файловыми шарами. В первой части рассмотрим отчеты.
В посте будут рассмотрены следующие вопросы:
- Как вывести список всех сетевых папок на компьютере (компьютерах)
- Создаем отчеты о размерах сетевых папок
- Определяем владельцев файлов
- Находим дату создания файлов выявляем «старые» файлы и файлы, созданные за определенный промежуток времени)
Итак, под катом вы найдете перевод статьи File Server Management with Windows PowerShell.
Получаем все сетевые папки
Начнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запрос класса Win32_Share, чтобы использовать Windows Management Instrumentation (WMI). Вам даже не нужно логиниться на файловом сервере. Вы можете запустить эту команду откуда угодно.
Вместо chi-fp01 укажем имя интересующего нас компьютера
Запустив эту команду Вы получите все сетевые папки, включая принтеры (если таковые имеются). Но так как мы говорим о файловых шарах, то давайте ограничим запрос. Все экземпляры Win32_Share имеют свойство Type, как показано в таблице 1.
Добавим фильтр в первоначальную команду:
Тем самым мы выводим только нужную информацию.
Но если вы ищите также и скрытые папки – те, которые заканчиваются знаком доллара ($) – фильтр придется слегка переписать:
В WMI знак процента (%) используется вместо знака подстановки (wildcard). Вывести все папки, кроме тех, которые скрыты чуть сложнее.
Команда выведен все объекты Win32_Share, у которых свойство Type равно 0 и имя не заканчивается на $.
Получаем размер сетевой папки
Довольно часто необходима информация о том, сколько места занимают файловые шары. Используем Get-ChildItem, или его сокращение dir, и передадим результаты в Measure-Object:
В итоге вы получите информацию об общем числе объектов, размер в байтах, наименьшие и наибольшее размерах файлов. В предыдущей команде, применил фильтр. В PowerShell 3.0 то же самое можно сделать проще, однако та команда, которую я использовал, работает как v2.0, так и 3.0. Ее лучше всего запускать локально. Код в примере 1 комбинирует эту команду с нашей техникой WMI, чтобы получить отчет о размере высокоуровневых папок.
Пример 1: Отчет о размерах высокоуровневых сетевых папок
Вы можете форматировать или обрабатывать $results как вашей душе будет угодно. Нужна удобоваримая таблица? Просто используйте следующую команду:
Тем самым можно сделать полный отчет по использованию всех папок на файловом сервере не составляет труда. Сэкономьте время, воспользуетесь примером 2.
Пример 2: Отчет об использовании файловых шар
И снова я слегка отформатирую таблицу.
Получаем файлы по владельцу
Двигаемся дальше – найдем владельцев файлов. Если вы используете квоты, отчеты уже наверняка получаете. В противном случае, все, что вам нужно – это извлечь ACL файла, который включает в себя владельца, и агрегировать результаты. Лучше всего добавить владельца файла в качестве кастомного свойства
Мы можем группировать по свойству нового владельца и затем обрабатывать новый объект.
Пара усилий и вы можете применить тот же подход к файловой шаре, как указано в коде примера 3.
Пример 3: Группируем файловые шары по владельцу
Я также должен указать на то, что могут проблемы: с файлами, имя которых более 260 символов или содержит необычные символы, особенно если вы пытаетесь запустить Get-ACL. В PowerShell 3.0 этот командлет имеет параметр -LiteralPath, что помогает решить вышеуказанные проблемы.
Опять выведем читаемую таблицу.
Получаем файлы по дате создания
Последняя техника создания отчетов, которую я хочу продемонстрировать – это создание отчета с последними созданными файлами. Фактически, мы создаем коллекцию объектов, которую можем использовать несколькими способами. Возможно вы захотите использовать объекты или удалить или переместить файлы, или можете захотите построить отчет, который можно отправить руководству. Всегда создавайте команды PowerShell так, чтобы потом их можно использовать.
Определить возраст файл не так просто. В PowerShell файловый объект (объект типа файл) имеет несколько свойств, которые вы возможно захотите использовать. Например, команда:
дает вывод, представленный на скриншоте ниже.
Лично я считаю, что лучше использовать LastWriteTime, который обозначает, когда к файлу в последний раз обращались. Мне встречались ситуации, когда LastAccessTime обновлялся через сторонние программы, например, антивирус, что само по себе уже не означает правды. И LastAccessTime был деактивировал еще со времени Windows Vista, хотя вы можете его включить. Вам также нужно быть осторожным, потому что эти значения могут меняться в зависимости от того, копируете ли вы или перемещаете файлы между дисками (between volumes). Но вы можете решить это сами. Используя этот файл как пример, мы может заставить PowerShell сказать нам, насколько стар файл. См. пример 4.
Пример 4. Определяем возраст файлов
Свойство Age является объектом TimeSpan, и свойство Days является просто свойством TotalDays этого объекта. Но так как мы можем этом сделать для одного файла, мы можем сделать и для других Давайте взглянем на мою общую папку и найдем все файлы, которые не менялись за последние 400 дней.
Я пойду дальше и включу еще и владельца файла. На скриншоте ниже показаны результаты от запуска этого код в удаленной сессии на моем файловом сервере.
Я могу сохранить эти результаты в переменную и использовать их в любое время. Так как у меня есть полное имя файла, передать в другую команду, например, Remove-Item, не составит труда.
Одной из моих любимых техник является определение того, сколько файлов было изменено за год.
Как вы можете видеть на скриншоте, все выглядит причесано. Нужны детали? Можно проанализировать свойство Group, которое представляет собой коллекцию файлов.
Полезно знать, сколько файлов не изменялось за 30, 90 или 180 дней. К сожалению, простого способа использовать Group-Object для этого не существует, поэтому мне необходимо придется «пойти иным путем»; смотрите пример 5.
Пример 5: Определяем период изменения файлов
На рисунке ниже показан результат, когда я запустил этот код для папки с моими скриптами, которая, как я знаю, имеет плотное распределение по возрасту (decent age distribution). Мой код не включает в себя актуальные файлы, но это было бы слишком сложно изменить мой пример.
За основу поста использована первая часть статьи File Server Management with Windows PowerShell.
Кстати, о том, как найти файлы с помощью PowerShell и WMI Джеффри Хикс пишет в своем блоге (часть 1 и 2).
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.