Получаем и изменяем в Powershell атрибуты файла
Атрибуты файла Powershell можно получить несколькими способами, все зависит от ситуации. В powershell все что мы получаем является объектами, а у объектов есть «участники»(member), которые делятся на свойства и методы. Под атрибутами обычно и подразумевают свойства, а под методами действия типа запись или удаление.
Для получения свойств файла powershell мы можем выполнить следующую команду:
Get-ItemProperty -Path C:\Folder1\file1.txt | SELECT *
Таким образом у нас выводятся все свойства:
Мы можем и методы и свойства в powershell использую другой командлет:
Get-ItemProperty -Path C:\Folder1\file1.txt | Get-Member
Для получение свойства объекта мне легче всего объявить переменную и вызвать так:
$doc = Get-ItemProperty -Path C:\Folder1\file1.txt
$doc.GetType()
Например я хочу изменить свойство файла в powershell и поставить «только чтение». Для этого мне нужно получить всех участников объекта и присвоить значение:
$file = Get-ItemProperty -Path C:\Folder1\file1.txt
$file | Get-Member
Для изменения я должен вызвать свойство и присвоить $true или $false т.к. значения принимаются только типа bool:
$file.IsReadOnly = $true
Мы можем изменить так же время создания файла в powershell:
$date = Get-Date -Year 2077
$file.CreationTime = $date
Если мы хотим изменить атрибуты объекта, которые не видны в Property, то мы можем сделать так:
$file.Attributes = "ReadOnly","Archive"
Если мы захотим добавить какое-то атрибут, то мы должны будем перечислить их все. Иначе они уберутся:
$file.Attributes = "ReadOnly","Archive","Hidden"
Можно сделать так:
$file.Attributes += "NotContentIndexed"
Таким образом мы сложим существующие атрибуты с новым.
Что бы увидеть все значения, которые мы можем записать в атрибут можно выполнить:
[enum]::GetNames("system.io.fileattributes")
- ReadOnly
- Hidden
- System
- Directory
- Archive
- Device
- Normal
- Temporary
- SparseFile
- ReparsePoint
- Compressed
- Offline
- NotContentIndexed
- Encrypted
- IntegrityStream
- NoScrubData
Часть атрибутов мы можем изменять так:
Set-ItemProperty -Path C:\Folder1\file1.txt -Name Attributes -Value "ReadOnly"
Если нам нужно изменить атрибуты множества объектов, то можно сделать так:
Get-ChildItem -Path C:\Folder1\* -Include "*.txt" | foreach {$_.Attributes+="Hidden"}
О том как работать с Get-ChildItem было описано тут.
Если мы выполним следующею команду, то получим только powershell методы:
Get-ItemProperty -Path C:\diskusage.csv | Get-Member -MemberType Method
Методы позволяют делать какие-то изменения с объектами.
Например так мы можем добавить строку в конец документа:
$doc = Get-ItemProperty -Path "2.txt"
$data = $doc.AppendText()
$data.Write([Environment]::NewLine + "Текст с новой строки")
$data.Dispose()
А так мы можем удалить файлы, у которых определенная дата:
#Объявляем какую-то дату
$date = Get-Date -Year 2019
#Получаем все файлы в каталогах. -Force помогает получать скрытые объекты
$docs = Get-ChildItem -Path C:\Folder1\ -Recurse -Force
#Каждый объект, который был создан позже 2019 удалить
$docs | where {$_.CreationTime -gt $date.Year} | foreach {$_.Delete()}
…
Теги: #powershell
Powershell дата создания файла
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).
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
В посте будут рассмотрены следующие вопросы:
- Как вывести список всех сетевых папок на компьютере (компьютерах)
- Создаем отчеты о размерах сетевых папок
- Определяем владельцев файлов
- Находим дату создания файлов выявляем «старые» файлы и файлы, созданные за определенный промежуток времени)
Итак, под катом вы найдете перевод статьи File Server Management with Windows PowerShell.
Получаем все сетевые папки
Начнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запрос класса Win32_Share, чтобы использовать Windows Management Instrumentation (WMI). Вам даже не нужно логиниться на файловом сервере. Вы можете запустить эту команду откуда угодно.
Get-WmiObject -class -Win32_Share -computername chi-fp01
Вместо chi-fp01 укажем имя интересующего нас компьютера
Запустив эту команду Вы получите все сетевые папки, включая принтеры (если таковые имеются). Но так как мы говорим о файловых шарах, то давайте ограничим запрос. Все экземпляры Win32_Share имеют свойство Type, как показано в таблице 1.
Добавим фильтр в первоначальную команду:
Get-WmiObject -class -Win32_Share -computername chi-fp01 –filter "Type=0"
Тем самым мы выводим только нужную информацию.
Но если вы ищите также и скрытые папки – те, которые заканчиваются знаком доллара ($) – фильтр придется слегка переписать:
Get-WmiObject -Class win32_share -computername chi-fp01 –filter "Type=0 AND name like '%$'"
В WMI знак процента (%) используется вместо знака подстановки (wildcard). Вывести все папки, кроме тех, которые скрыты чуть сложнее.
Get-WmiObject -Class win32_share -computername chi-fp01–filter "type=0 AND name like '%[^$]'"
Команда выведен все объекты Win32_Share, у которых свойство Type равно 0 и имя не заканчивается на $.
Получаем размер сетевой папки
Довольно часто необходима информация о том, сколько места занимают файловые шары. Используем Get-ChildItem, или его сокращение dir, и передадим результаты в Measure-Object:
dir c:\shares\public -recurse | where {-Not $_.PSIsContainer}| Measure-Object -Property length -Sum -Minimum -Maximum
В итоге вы получите информацию об общем числе объектов, размер в байтах, наименьшие и наибольшее размерах файлов. В предыдущей команде, применил фильтр. В PowerShell 3.0 то же самое можно сделать проще, однако та команда, которую я использовал, работает как v2.0, так и 3.0. Ее лучше всего запускать локально. Код в примере 1 комбинирует эту команду с нашей техникой WMI, чтобы получить отчет о размере высокоуровневых папок.
Пример 1: Отчет о размерах высокоуровневых сетевых папок
$share=Get-WmiObject -Class Win32_Share -ComputerName
CHI-FP01 -filter "name='Sales'"
$sb={
Param ($path)
dir $path | where {$_.PSIscontainer} |
foreach {
$stats=dir $_.Fullname -recurse -errorAction
"SilentlyContinue" | where {-NOT $_.PSIscontainer} |
Measure-object -Property Length -sum
New-Object -TypeName PSObject -Property @{
Computername=$env:Computername
Path=$_.Name
Fullname=$_.Fullname
SizeKB=[math]::Round(($stats.sum/1KB),2)
NumberFiles=$stats.count
} #property
} #foreach
} #sb
$results=Invoke-Command -ScriptBlock $sb -ComputerName
$share.__SERVER -ArgumentList @($share.path)
-HideComputerName
Вы можете форматировать или обрабатывать $results как вашей душе будет угодно. Нужна удобоваримая таблица? Просто используйте следующую команду:
$results | Format-Table Computername,Fullname,SizeKB,NumberFiles -autosize
Тем самым можно сделать полный отчет по использованию всех папок на файловом сервере не составляет труда. Сэкономьте время, воспользуетесь примером 2.
Пример 2: Отчет об использовании файловых шар
$sb={
#Get the file shares locally.
$shares=Get-WmiObject -Class Win32_Share -filter "type=0"
foreach ($share in $shares) {
#Suppress any access denied error messages.
Write-Host "Measuring $($share.path)" -ForegroundColor Green
$stats=dir $share.path -Recurse -ErrorAction SilentlyContinue |
Where {-Not $_.PSIscontainer} |
Measure-Object -Property Length -Sum
$hash=@{
Computername=$env:Computername
Path=$share.path
Share=$share.Name
SizeKB=[math]::Round(($stats.sum/1KB),2)
Files=$stats.count
}
#Write a custom object to the pipeline for each share.
New-Object -TypeName PSObject -Property $hash
} #foreach $share
}#sb
$results = Invoke-Command -ScriptBlock $sb -ComputerName
CHI-FP01 -HideComputerName
И снова я слегка отформатирую таблицу.
$results | sort SizeKB –Descending | Select Computername,Share,SizeKB,Files | ft -auto
Получаем файлы по владельцу
Двигаемся дальше – найдем владельцев файлов. Если вы используете квоты, отчеты уже наверняка получаете. В противном случае, все, что вам нужно – это извлечь ACL файла, который включает в себя владельца, и агрегировать результаты. Лучше всего добавить владельца файла в качестве кастомного свойства
$data=dir | where {-not $_.PSIsContainer} | select name, @{Name="Owner";Expression={(Get-ACL $_.fullname).Owner}}, length
Мы можем группировать по свойству нового владельца и затем обрабатывать новый объект.
$data | group owner | Select Name,Count,@{Name="Size";Expression={($_.Group | Measure-Object -Property Length -sum).Sum}}
Пара усилий и вы можете применить тот же подход к файловой шаре, как указано в коде примера 3.
Пример 3: Группируем файловые шары по владельцу
$sb={
Param($path)
$data=dir $path |
where {-not $_.PSIsContainer} |
select name, @{Name="Owner";Expression=
{(Get-ACL $_.fullname).Owner}},length
$data | group -property owner |
Select @{Name="Computername";Expression={$env:computername}},
@{Name="Path";Expression={$path}},Name,Count,@{Name=
"Size";Expression={
($_.Group | Measure-Object -Property Length -sum).Sum}}
} #sb
<#
Run the command remotely and suppress the RunspaceID since we
don't really need it.
#>
Invoke-Command -ScriptBlock $sb -ComputerName CHI-FP01
-ArgumentList @("c:\shares\public") -HideComputerName |
Select * -ExcludeProperty RunspaceID
Я также должен указать на то, что могут проблемы: с файлами, имя которых более 260 символов или содержит необычные символы, особенно если вы пытаетесь запустить Get-ACL. В PowerShell 3.0 этот командлет имеет параметр -LiteralPath, что помогает решить вышеуказанные проблемы.
Опять выведем читаемую таблицу.
$data | Sort Size | ft -auto
Получаем файлы по дате создания
Последняя техника создания отчетов, которую я хочу продемонстрировать – это создание отчета с последними созданными файлами. Фактически, мы создаем коллекцию объектов, которую можем использовать несколькими способами. Возможно вы захотите использовать объекты или удалить или переместить файлы, или можете захотите построить отчет, который можно отправить руководству. Всегда создавайте команды PowerShell так, чтобы потом их можно использовать.
Определить возраст файл не так просто. В PowerShell файловый объект (объект типа файл) имеет несколько свойств, которые вы возможно захотите использовать. Например, команда:
get-item c:\work\wishlist.txt | Format-List Name,*time
дает вывод, представленный на скриншоте ниже.
Лично я считаю, что лучше использовать LastWriteTime, который обозначает, когда к файлу в последний раз обращались. Мне встречались ситуации, когда LastAccessTime обновлялся через сторонние программы, например, антивирус, что само по себе уже не означает правды. И LastAccessTime был деактивировал еще со времени Windows Vista, хотя вы можете его включить. Вам также нужно быть осторожным, потому что эти значения могут меняться в зависимости от того, копируете ли вы или перемещаете файлы между дисками (between volumes). Но вы можете решить это сами. Используя этот файл как пример, мы может заставить PowerShell сказать нам, насколько стар файл. См. пример 4.
Пример 4. Определяем возраст файлов
PS C:\work> get-item wishlist.txt | format-list name,
CreationTime,LastWriteTime,
>> @{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
>> @{Name="Days";Expression={((Get-Date)
-$_.LastWriteTime).TotalDays}}
>>
Name : wishlist.txt
CreationTime : 11/23/2010 10:31:10 PM
LastWriteTime : 2/15/2011 7:36:34 AM
Age : 511.06:42:17.4251748
Days : 511.279372271039
Свойство Age является объектом TimeSpan, и свойство Days является просто свойством TotalDays этого объекта. Но так как мы можем этом сделать для одного файла, мы можем сделать и для других Давайте взглянем на мою общую папку и найдем все файлы, которые не менялись за последние 400 дней.
dir c:\shares\public -recurse | Select Fullname,CreationTime,LastWriteTime,
@{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
@{Name="Days";Expression={[int]((Get-Date) -$_.LastWriteTime).TotalDays}},
@{Name="Owner";Expression={(Get-ACL $_.fullname).Owner}} | Where {$_.Days -ge 400} | Sort Days -Descending
Я пойду дальше и включу еще и владельца файла. На скриншоте ниже показаны результаты от запуска этого код в удаленной сессии на моем файловом сервере.
Я могу сохранить эти результаты в переменную и использовать их в любое время. Так как у меня есть полное имя файла, передать в другую команду, например, Remove-Item, не составит труда.
Одной из моих любимых техник является определение того, сколько файлов было изменено за год.
dir c:\shares\sales -recurse | Select Fullname,LastWriteTime,
@{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
@{Name="Year";Expression={$_.LastWriteTime.Year}} | Group-Object Year | Sort Name
Как вы можете видеть на скриншоте, все выглядит причесано. Нужны детали? Можно проанализировать свойство Group, которое представляет собой коллекцию файлов.
Полезно знать, сколько файлов не изменялось за 30, 90 или 180 дней. К сожалению, простого способа использовать Group-Object для этого не существует, поэтому мне необходимо придется «пойти иным путем»; смотрите пример 5.
Пример 5: Определяем период изменения файлов
$path="c:\scripts"
#Get some other properties in case we want to further
#break down each bucket.
$files=dir $path -recurse |
Select Fullname,CreationTime,LastWriteTime,Length,
@{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
@{Name="Days";Expression={[int]((Get-Date)
-$_.LastWriteTime).TotalDays}}
$hash=@{
Path=$path
Over= ($files | Where {$_.Days -gt 365} | Measure-Object).Count
'365Days'= ($files | Where {$_.Days -gt 180 -AND
$_.Days -le 365} | Measure-Object).Count
'180Days'= ($files | Where {$_.Days -gt 90 -AND
$_.Days -le 180} | Measure-Object).Count
'90Days'= ($files | Where {$_.Days -gt 30 -AND
$_.Days -le 90} | Measure-Object).Count
'30Days'= ($files | Where {$_.Days -gt 7 -AND
$_.Days -le 30} | Measure-Object).Count
'7Days'= ($files | Where {$_.Days -gt 0 -AND
$_.Days -le 7} | Measure-Object).Count
}
New-Object -TypeName PSObject -Property $hash |
Select Path,Over,365Days,180Days,90Days,30Days,7Days
На рисунке ниже показан результат, когда я запустил этот код для папки с моими скриптами, которая, как я знаю, имеет плотное распределение по возрасту (decent age distribution). Мой код не включает в себя актуальные файлы, но это было бы слишком сложно изменить мой пример.
За основу поста использована первая часть статьи File Server Management with Windows PowerShell.
Бонус:
Кстати, о том, как найти файлы с помощью PowerShell и WMI Джеффри Хикс пишет в своем блоге (часть 1 и 2).
Из-за файлового менеджера при перемещении фотографий у всех файлов проставилась дата создания и модификации с текущей датой из-за чего в фото галереи сбилась вся историческая последовательность.
Поиск в интернете выдал несколько программ для изменения атрибутов дат:
1) File Attribute Changer http://www.hoaitech.com/
2) Attribute Changer https://www.petges.lu/
3) BulkFileChanger и FileDate Changer от NirSoft http://www.nirsoft.net/utils/bulk_file_changer.html
4) Total Commander
К сожалению все программы умеют только задавать дату исходя из текущей даты или заданной даты в атрибуте файла с добавлением вычислений в виде сдвига, и ни одна не умеет работать с шаблоном на основе имени файла.
Решение было написано за пару минут на PowerShell с учетом поиска в Google.
Открываем PowerShell_Ise.exe и вставляем наш скрипт.
Аналогично можно поступить с видео файлами mp4
get-childitem -Path «d:\WhatsApp\Media\WhatsApp Photo\IMG-*.jpg» | % {
$date = $_.Name.Substring(4,4) + «-» + $_.Name.Substring(8,2) + «-» + $_.Name.Substring(10,2)
write-host $_.Name » -> » $date
$d = (get-date $date)
# CreationTime, LastWriteTime
(Get-ItemProperty $_.FullName).CreationTime = $d
(Get-ItemProperty $_.FullName).LastWriteTime = $d
}
Статья про атрибуты файла на MSDN:
https://msdn.microsoft.com/ru-ru/library/system.io.filesysteminfo_properties(v=vs.110).aspx
Уроки Powershell – работа с файлами и папками
Честно говоря, когда я принялся за работу над этим уроком я не знал о чем писать.
Очень уж простым показался вопрос, потому что все примеры есть в стандартной помощи, доступной прямо из консоли.
Казалось бы, все банально, есть командлеты Item которые позволяют создавать (New-Item), удалять (Remove-Item), копировать (Copy-Item) и переименовывать (Rename-Item) и выжать из этого ничего нельзя, но я попробую.
Теория
По сути своей мало что изменилось, более правильно сказать “видоизменилось”, и получило новые возможности которые несомненно пригодятся для работы. Если внимательно присмотреться то видно что старые команды поддерживаются через псевдонимы, вернее псевдонимы облегчают переход и поэтому освоение новых команд облегчено и снабжено богатым справочным материалом.
Давайте вернемся к вопросу преемственности поколений… Тьфу. Перехода на новые синтаксис
Первым на что следует посмотреть это аналог хорошо знакомой команды dir, это командлет Get-Children.
Примечание: Действие командлета Get-Children его распространяется не только на файловую систему. Но об этом позже.
В консоли PowerShell введите команду dir, нажмите Enter, затем Get-ChildItem D:\Script и снова Enter, посмотрите на результаты. Они одинаковы. Поптому что dir является алиасом к Get-Children.
Вывод – PowerShell унаследовал все старые команды и снабдил нас замечательной справочной системой.
Как дополнительный пример можно привести аналог для dir /S которая рекурсивно выводит список файлов будет команда.
Get-ChildItem -Force D:\Script -Recurse
На замену dir *.exe пришла возможность фильтрации элементов при помощи параметров Path, Filter, Include и Exclude.
Примечание: В своей практике я видел множество вариантов использования но чаще всего фильтрация осуществлялась лишь по имени.
Добавилась сложная фильтрация элементов при помощи командлета Where-Object (сокращенное написание Where).
Простой пример фильтрации по расширению.
Get-ChildItem -Path C:\Windows | Where {$_.extension -eq «.dll»}Дополнение: PowerShell использует в качестве подстановочных знаков не только ? и * как это было в cmd.exe, но и группы символов в квадратных скобках.
Поэтому если вы попробуете найти файл Script[01].ps1 командой
Get-ChildItem ‘.\Script[01].ps1′
То получите ошибку.
В этом случае необходимо использовать параметр -LitealPath
Get-ChildItem -LiteralPath ‘.\Script[01].ps1′
Более сложный вариант выполнит поиск архивов в папке D:\Backup, созданных после 1 мая 2011 года, размер которых находится в диапазоне 10-100 Мб.
Get-ChildItem -Path D:\Backup -Recurse -Include *.zip | Where-Object -FilterScript {($_.LastWriteTime -gt «2011-05-01») -and ($_.Length -ge 10mb) -and ($_.Length -le 100mb)}Опции Include и Exclude работают соответственно своим названиям т.е. первая включает а вторая исключает заданный фильтр из поиска.
$exclude = @(‘*.dll’,‘*.exe’)
$include = @(‘*.txt’,‘*.ps1′)
$result1 = Get-ChildItem «C:\Script» -Recurse -Exclude $exclude
$result2 = Get-ChildItem «D:\Script» -Recurse -Include $include
Перейдем к вопросу копирования файлов.
Аналогом команды copy стал командлет Copy-Item.
Copy-Item -Path D:\Script\script-01.ps1 -Destination E:\Backup\27-09-2011\script-01.ps1
В случае если целевой файл уже существует, при попытке его скопировать вы встретите ругань красного цвета и процесс копирования закончится. Для перезаписи целевого файла используется параметр Force:
Copy-Item -Path D:\Script\script-01.ps1 -Destination E:\Backup\27-09-2011\script-01.ps1 -Force
Примечание: Ключ Force работает даже когда целевой файл помечен как файл только для чтения.
Копирование дерева папок выполняется той же командой, но с указанием ключа Recurse.
Copy-Item -Path D:\Script -Recurse E:\Backup\27-09-2011
При необходимости копирования определенных объектов, например только скриптов PowerShell-а вы можете задать фильтр.
Copy-Item -Filter *.txt -Path D:\Script -Recurse E:\Backup\27-09-2011
Создание файлов и папок средствами PowerShell производится с помощью командлета New-Item.
Для создания папки придется указать тип элемента “Directory”, а для создания файла “File”
New-Item -Path ‘D:\Script\New Folder’ -ItemType «directory»
New-Item -Path ‘D:\Script\New Folder\script-02.ps1′ -ItemType «file»
Примечание: Старая команда mkdir, позволяющая создавать папки получила новую жизнь в виде алиаса md.
Переименование элементов производится с помощью команды Rename-Item.
Rename-Item .\File-01.ps1 .\File-01.ps1.bak
Удаление производится с помощью Remove-Item.
Удалить вложенные в папку элементы можно при помощи командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. К примеру, в случае если мы пытаемся удалить папку d:\Backup\20-09-2011, содержащую другие элементы, powershell предложит подтвердить свои действия. Для того что бы этого не происходило (подумайте о том дествительно ли вам нужно удалять )
Remove-Item d:\Backup\20-09-2011 -Recurse
Практика
Практическое применение всего вышесказанного может быть разнообразно.
Например, может быть задача поиска в лог файлах определенного выражения по маске ip-адреса “192.168.100.253″ с последующим копированием найденного в папку D:\TEMP, вариантов множество, вот метод поиска:
$current = Get-Date$Days = «-30»
$start = $current.AddDays($days)
Get-ChildItem D:\Logs -Filter *.log -Recurse | Where-Object {($_.LastWriteTime.Date -ge $Start.Date) -and ($_.LastWriteTime.Date -le $End.Date)} | Select-String «192.168.100.253» | Copy-Item -Destination D:\TEMP
Можно придумать сценарий когда на файловой помойке требуется из определенной папки удалять все файлы и папки старше 30 дней.
$Path = «C:\temp»$Days = «-30»
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
Или если вам требуется удалять все что есть в папке и в подпапках т.е. удаление еще и самих папок.
$Path = «C:\temp»$Days = «-30»
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path -Recuse | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
PS. Альтернативный метод решения задачи удаления временных файлов скриптом по расписанию вы можете найти в блоге Вадима Стеркина. Рекомендую.
Похожие статьи
Информация об авторе
.
Powershell создание файлов и директорий
Для того, что бы в Powershell создать файл необходимо запустить его с правами администратора. Это необходимо, если мы используем Windows с графическим интерфейсом.
Если редакция Windows версии Core, то там необходимости в этом нет, но в этом случае, возможно, понадобится перейти в консоль командой:
powershell
Для создания файла в папке откуда запущен powershell нужно написать:
New-Item -Name "file.txt"
Где «file» — это имя вашего файла, а «txt» его расширение. Кавычки ставить не обязательно, но желательно т.к. powershell не все символы может воспринимать корректно (например пробелы или кириллические символы).
Если нам нужно создать файл в какой-то другой папке, можно сделать так:
New-Item -Name "file.txt" -Path "c:\papka\"
Где «c:\papka\» это абсолютный путь к папке. Если в -Path написать просто ‘Papka’, то он будет искать эту папку в том же каталоге, откуда и запущен powershell.
Создание директорий в Powershell
С помощью этой же команды можно создать директорию. Для этого выполните:
New-Item -ItemType "catalog" -Path "c:\"
Где catalog — имя для папки.
Возможные ошибки при создании файла в Powershell
Если указанного пути не будет существовать или использовано недопустимое имя (со знаком / например) появится ошибка:
New-Item : Не удалось найти часть пути. "C:\Papka1\test2.txt"
В случае, если у нас не будет хватать прав на создание файла или консоль будет запущена не от имени администратора — появится ошибка типа:
New-Item : Отказано в доступе по пути "C:\1".
Другие варианты использования команды
С помощью этой команды можно так же создать и папку. Для получения справки по команде мы можем выполнить
Get-Help 'New-Item'
Если мы хотим увидеть варианты исполнения команды, то можно добавить ключ -Examples
Get-Help 'New-Item' -Examples
…
Теги: #powershell #windows
. Причем это не потребует написания сценариев. Все, что я собираюсь показать, потребует всего несколько интерактивных команд. Конечно, если вам придется запускать эти команды часто, сохранить их в виде сценария или функции будет логично.
Особенность Powershell заключается в том, что вы можете взять результаты команд, которые я собираюсь показать, и сделать с ними все, что захотите. Необходимо сохранить результат в файл. csv? Используйте Export-CSV. Нужен отчет в формате HTML? Вам поможет ConvertTo-HTML. Кроме того, все, что я собираюсь продемонстрировать, масштабируется; если вы можете применить команду для одного компьютера, она может быть использована для 10, 100 или 1000 систем.
Сначала я покажу вам, как управлять тем, что уже находится в общих папках. Затем мы рассмотрим процесс создания и удаления общих папок.
Получение списка общих папок
Давайте начнем с определения того, что находится в общих папках. Просто создайте запрос к классу Win32_Share инструментария управления WMI. Вам даже не нужно регистрироваться на файловом сервере, вы можете запустить эту команду со своего рабочего места:
Get-WmiObject -class -Win32_Share -computernameMyFile
После выполнения данной команды вы получите список общих ресурсов, включая принтеры (если они есть). Поскольку мы говорим об общих файловых ресурсах, давайте изменим запрос соответствующим образом. Каждый объект Win32_Share имеет свойство «Тип», см. таблицу. Таким образом, чтобы ограничить наш запрос, мы можем добавить фильтр к первоначальной команде.
Get-WmiObject -class -Win32_Share -computernameMyFile–filter«Type=0»
Таким образом, мы исключили административные общие ресурсы. Это можно увидеть на экране 1.
Экран 1. Вывод неадминистративных общих ресурсов с? помощью WMI |
Для получения списка скрытых общих ресурсов – тех, что заканчиваются значком доллара ($), — вам нужно лишь немного изменить фильтр:
Get-WmiObject -Class win32_share -computernameMyFile –filter «Type=0 AND name like '%$'»
В WMI символ % используется как знак подстановки. Поэтому получить список общих ресурсов, за исключением скрытых, немного сложнее, нам потребуется сравнение с использованием подстановочного символа:
Get-WmiObject -Class win32_share -computernameMyFile–filter «type=0 AND name like '%[^$]'»
Эта команда возвращает все объекты Win32_Share, у которых свойство «Тип» равно 0 и имя не заканчивается на $.
Определение размера папки
Одной из типичных задач администратора является создание отчетов о том, как много места занимает папка. Быстрый способ — задействовать команду Get-ChildItem, или ее псевдоним (alias) dir, и перенаправить вывод в Measure-Object:
dir c:sharespublic -recurse | where {-Not $_.PSIsContainer}| Measure-Object -Property length -Sum -Minimum –Maximum
В результате вы получите объект, который показывает общее количество элементов, общий объем в байтах, наименьший и наибольший файлы. В предыдущей команде я исключил папки. В Powershell 3.0 предусмотрен лучший способ сделать это, но команда, которую я использовал, работает как в Powershell 2.0, так и в Powershell 3.0. Эта команда относится к тому типу, который лучше запускать локально (хороший повод удаленно использовать Powershell). Код в Листинге 1 задействует эту команду совместно с нашим механизмом WMI для получения отчета о размере папок верхнего уровня. Вы можете форматировать или обрабатывать $results так, как хотите. Как насчет удобной для чтения таблицы? Просто используйте команду:
$results | Format-Table Computername,Fullname,SizeKB,NumberFiles -autosize
На экране 2 показан приблизительный результат.
Экран 2. Вывод в виде таблицы |
Для создания полного отчета об используемом дисковом пространстве для всех общих файловых ресурсов не потребуется много усилий. Я сэкономлю ваше время: взгляните на листинг 2. Как и в прошлый раз, я могу отформатировать $results так, как хочу. Результат использования этой техники показан на экране 3.
Экран 3. Отчет об использовании дискового пространства на файловом сервере |
Получение списка файлов по владельцу
Другая вариация на эту тему — поиск файлов по их владельцу. Если вы применяете квоты, то вероятно уже составляете отчеты об их использовании. Если нет, то все, что вам нужно, это получить список управления доступом ACL для файла, который включает владельца, и обработать результаты. Мне кажется, лучший способ — это добавить владельца как настраиваемое свойство:
$data=dir | where {-not $_.PSIsContainer} | select name, @{Name=«Owner»;Expression={(Get-ACL $_.fullname).Owner}}, length
Мы можем сгруппировать полученный результат по владельцу, а затем обработать полученный объект.
$data | group owner | Select Name,Count,@{Name=«Size»;Expression= {($_.Group | Measure-Object -Property Length -sum).Sum}}
Приложив лишь немного усилий, вы сможете использовать эту же технику и для общих файловых ресурсов, как это делает код, указанный в листинге 3. Также необходимо отметить, что вы можете столкнуться с проблемами, если длина пути к файлу превышает 260 символов или если имена файлов содержат необычные символы, особенно при выполнении команды Get-Acl. В Powershell 3.0 эта команда поддерживает параметр – LiteralPath, который поможет в данном случае.
Нужно признать, что некоторые из приведенных примеров требуют набора довольно большого количества текста, и это не единственный способ выполнения задач, но они демонстрируют, что вы можете сделать. Для разовых отчетов можно обойтись меньшей детализацией. На экране 4 показан пример кода, который представляет результаты в виде таблицы.
Экран 4. Разовый отчет |
Получение файлов по возрасту
Последний прием, который я хочу продемонстрировать, это составление отчетов, основанных на времени создания файлов. На самом деле мы создаем коллекцию объектов, которую можем в дальнейшем использовать несколькими способами. Вы можете задействовать эти объекты для удаления или перемещения файлов или для создания отчета, который затем можно отправить руководству по электронной почте. Всегда составляйте команды Powershell, держа в уме их повторное использование в дальнейшем.
Определение возраста файла — нетривиальная задача. В Powershell объект «файл» имеет несколько свойств, которые вы можете использовать. Например:
get-item c:workwishlist.txt | Format-List Name,*time
выводит результат, показанный на экране 5.
Экран 5. Свойства файла |
Лично мне свойство LastWriteTime кажется наиболее подходящим для определения времени, когда предоставлялся доступ к файлу. Мне встречались ситуации, когда свойство LastAccessTime обновлялось сторонним приложением, например антивирусом, что может приводить к ошибочным заключениям. Кроме того, LastAccessTime по умолчанию отключено со времен WindowsVista, но вы можете включить его. Нужно быть осторожным, так как значения этих свойств могут меняться, в зависимости от того, копируете вы или перемещаете файлы с тома на том. Однако окончательное решение остается за вами. Используя данный файл в качестве примера, мы можем с помощью Powershell определить возраст файла, как показано в листинге 4.
Параметр Age — это объект типа TimeSpan, а параметр Days — это просто значение параметра TotalDays данного объекта. Поскольку мы можем выполнить эту процедуру для одного файла, можем и для всех файлов. Давайте взглянем на мой общий ресурс Public и найдем все файлы, которые не изменялись 400 дней.
dir c:sharespublic -recurse | Select Fullname,CreationTime,LastWriteTime, @{Name=«Age»;Expression={(Get-Date)-$_.LastWriteTime}}, @{Name=«Days»;Expression={[int]((Get-Date)-$_.LastWriteTime).TotalDays}}, @{Name=«Owner»;Expression={(Get-ACL $_.fullname).Owner}} | Where {$_.Days -ge 400} | Sort Days –Descending
Я продолжил и включил владельца файла. На экране 6 показан результат выполнения этого кода в удаленной сессии на моем сервере.
Экран 6. Выполнение кода в удаленной сессии |
Я мог сохранить эти результаты в переменную и использовать их повторно по своему усмотрению. Поскольку у меня было полное имя файла, перенаправление переменной в такую команду, как, например, Remove-Item, не составило бы труда.
Еще один подход — создание отчета или коллекции объектов. Для этого потребуется немного больше усилий; после того, как мы посчитаем или определим возраст элемента, потребуется добавить немного логики, чтобы что-нибудь с ним сделать.
Одна из моих любимых техник — это выяснение, сколько файлов было изменено с группировкой по годам (экран 7). И снова для демонстрации я буду использовать интерактивную удаленную сессию на своем файловом сервере.
dir c:sharessales -recurse | Select Fullname,LastWriteTime, @{Name=«Age»;Expression={(Get-Date)-$_.LastWriteTime}}, @{Name=«Year»;Expression={$_.LastWriteTime.Year}} | Group-Object Year | Sort Name
Экран 7. Поиск времени последнего изменения файлов с?группировкой по годам |
Если мне понадобится больше деталей, то я всегда могу проанализировать параметр Group, который является набором файлов.
Может пригодиться информация о том, сколько файлов не изменялись за последние 30, 90 или 180 дней. К сожалению, нет простого способа использовать для этого Group-Object, поэтому мне пришлось решать задачу «в лоб», как показано в листинге 5. На экране 8 показан результат, который получился в результате обработки этим кодом моей папки со сценариями, в которой, как я знал, располагаются файлы различного «возраста». Мой код не выводит сами файлы, но модифицировать его будет несложно.
Экран 8. Дата последнего изменения файлов |
Создание общих файловых ресурсов
Теперь давайте посмотрим, как можно использовать Powershell для создания общих файловых ресурсов и управления ими. Все, что я продемонстрировал до настоящего момента, будет работать как в Powershell 2.0, так и в Powershell 3.0 (хотя при использовании Powershell 3.0 мои примеры в некоторых местах можно упростить). Управление файловым сервером с помощью Powershell 2.0 требует применения WMI и написания сложных сценариев. Но в Powershell 3.0, особенно если вы используете Windows Server 2012, этот тип управления реализован очень удачно. Я собираюсь переключить передачу и управлять файловым сервером на базе WindowsServer 2012 с компьютера с установленной Windows 8. Таким образом, мне будут доступны некоторые дополнительные функции.
Все, что нам нужно, встроено в модуль SMBShare, который устанавливается в Windows 8 по умолчанию. Команды, входящие в этот модуль, позволяют с легкостью управлять общими файловыми ресурсам как на локальных, так и на удаленных серверах. Я не буду рассматривать каждую команду, но все они имеют схожий формат, и я настоятельно рекомендую прочитать подсказку и просмотреть примеры. Мы начнем с использования команды New-SMBShare, для того чтобы создать новый общий файловый ресурс.
Нам нужно указать путь к папке и, в отличие от того, как это происходит в случае использования графического интерфейса, команда не создает папку, если она не существует. Поэтому мы создадим ее и назначим разрешения NTFS. Это процедура состоит из нескольких шагов. Поскольку их нужно выполнить на удаленном сервере, я создам удаленную сессию Powershell.
$session=New-PSSession -ComputerName SRV2K12RC
Я мог бы использовать эту сессию интерактивно, но я собираюсь запускать команды, используя Invoke-Command, которые более предпочтительны, когда вы настраиваете автоматический процесс. Я создам новую папку:
invoke-command -ScriptBlock {mkdir c:sharescompanyfiles} -Session $session
Теперь более сложная часть. Я хочу назначить разрешения NTFS так, чтобы группа JDHLABDomainUsers имела разрешения на изменения Change. Для этого потребуется создать новое правило доступа, изменить список правил доступа и применить измененный список к папке. Я написал эту команду так, что она использует параметр в качестве пути, что делает возможным ее повторное использование:
Invoke-Command -ScriptBlock $sb -Session $session –ArgumentList c:sharescompanyfiles
Существует возможность ускорить этот процесс, но для ясности я предпочитаю выполнять каждый шаг отдельно. Теперь мы можем создать общую папку.
Я мог бы использовать существующую удаленную сессию, но мне хотелось продемонстрировать, что команду New-SmbShare можно задействовать для подключения к удаленному файловому серверу.
New-SmbShare -Name Files -Path c:sharescompanyfiles -CimSession SRV2K12RC -FullAccess «jdhlabdomain admins» -ChangeAccess Everyone -Description «Company files»
По умолчанию на общий ресурс предоставляются разрешения на чтение ReadOnly. Я предоставил администратором домена полные разрешения FullControl, а всем остальным разрешения на изменения Change. Путь, указанный в параметре path, локальный для удаленного компьютера, на котором должен быть установлен Powershell 3.0
Дополнительные параметры общего ресурса
Мы можем в любое время просмотреть свойства общего ресурса, используя команду Get-SMBShare, как показано на экране 9.
Экран 9. Использование команды Get-SMBShare для? просмотра свойств общей папки |
Я применил изменения к одной общей папке, но было бы также просто с помощью Get-SMBShare получить список всех общих папок и затем с помощью Set-SMBShare применить изменение ко всем.
Get-SMBShare -CimSession SRV2K12RC -Special $False | Set-SmbShare -EncryptData $True -Confirm:$false
Эта команда получает список всех общих папок (за исключением административных) на сервере SRV2K12RC и устанавливает значение параметра EncryptData, равное True. Мне не хотелось подтверждать каждое изменение, поэтому я установил значение ключа –Confirm равным False. Set-SMBshare ничего не передает дальше по конвейеру, если только не указать параметр –Passthru. Но мне удалось изменить сразу все одной простой командой.
Удаление общих папок
Последнее, что осталось рассмотреть, это удаление общих папок. Код в листинге 8 удаляет общий ресурс, который я только что создал. Может ли быть что-то проще? Конечно, сама папка осталось на сервере нетронутой.
Собираем все вместе
Давайте завершим наш обзор, собрав все части процесса управления в одном месте: рабочем процессе PowerShell Workflow. Я не могу в одной статье описать это огромное дополнение Powershell или приводить примеры кода, но должен сказать, что самое замечательное в Powershell Workflow то, что несколько команд могут выполняться параллельно. Например, после создания папки можно создать общий ресурс и назначить разрешения NTFS, см. листинг 9.
Этот процесс создает новую папку и новый общий ресурс, назначает права пользователю или группе. Я могу запустить его на своем компьютере с Windows 8, чтобы он отработал на удаленном сервере с WindowsServer 2012, следующей командой (ее нужно вводить одной строкой)
New-FileShare -Name adeco` -Path c:sharesadeco ` -Principal jdhlabadeco ` -Right «FullControl» ` -PSComputerName SRV2K12RC
Выполнение занимает всего несколько секунд. Результат показан на экране 10.
Экран 10. Создание общей папки с помощью Powershell Workflow |
Нет ничего плохого в использовании графического интерфейса для управления файловыми серверами. Но если вам нужны специальные отчеты или автоматизация, Powershell — лучшее, что может быть.
Если у вас есть вопросы по поводу этих примеров (или другие вопросы относительно Powershell), воспользуйтесь форумами на PowerShell.org.
Листинг 1. Получение отчета о размере папок верхнего уровня
$share=Get-WmiObject -Class Win32_Share -ComputerName CHI-FP01 -filter «name='Sales'» $sb={ Param ($path) dir $path | where {$_.PSIscontainer} | foreach { $stats=dir $_.Fullname -recurse -errorAction «SilentlyContinue» | where {-NOT $_.PSIscontainer} | Measure-object -Property Length -sum New-Object -TypeNamePSObject -Property @{ Computername=$env:Computername Path=$_.Name Fullname=$_.Fullname SizeKB=[math]::Round(($stats.sum/1KB),2) NumberFiles=$stats.count } #property } #foreach } #sb $results=Invoke-Command -ScriptBlock $sb -ComputerName $share.__SERVER -ArgumentList@($share.path) -HideComputerName
Листинг 2. Создание отчета об использовании общих ресурсов на файловом сервере
$sb={ #Get the file shares locally. $shares=Get-WmiObject -Class Win32_Share -filter «type=0» foreach ($share in $shares) { #Suppress any access denied error messages. Write-Host «Measuring $($share.path)» -ForegroundColor Green $stats=dir $share.path -Recurse -ErrorActionSilentlyContinue | Where {-Not $_.PSIscontainer} | Measure-Object -Property Length -Sum $hash=@{ Computername=$env:Computername Path=$share.path Share=$share.Name SizeKB=[math]::Round(($stats.sum/1KB),2) Files=$stats.count } #Write a custom object to the pipeline for each share. New-Object -TypeNamePSObject -Property $hash } #foreach $share }#sb $results = Invoke-Command -ScriptBlock $sb -ComputerName CHI-FP01 -HideComputerName
Листинг 3. Группируем вывод по владельцу файла
$sb={ Param($path) $data=dir $path | where {-not $_.PSIsContainer} | select name, @{Name=«Owner»;Expression= {(Get-ACL $_.fullname).Owner}},length $data | group -property owner | Select @{Name=«Computername»;Expression={$env:computername}}, @{Name=«Path»;Expression={$path}},Name,Count,@{Name= «Size»;Expression={ ($_.Group | Measure-Object -Property Length -sum).Sum}} } #sb Invoke-Command -ScriptBlock $sb -ComputerName CHI-FP01 -ArgumentList@(«c:sharespublic») -HideComputerName | Select * -ExcludePropertyRunspaceID
Листинг 4. Определяем возраст файла
PS C:work> get-item wishlist.txt | format-list name, CreationTime,LastWriteTime, >>@{Name=«Age»;Expression={(Get-Date)-$_.LastWriteTime}}, >>@{Name=«Days»;Expression={((Get-Date) -$_.LastWriteTime).TotalDays}} >> Name: wishlist.txt CreationTime: 11/23/2010 10:31:10 PM LastWriteTime: 2/15/2011 7:36:34 AM Age: 511.06:42:17.4251748 Days: 511.279372271039
Листинг 5. Определяем время последнего изменения файла
$path=«c:scripts» #Get some other properties in case we want to further #break down each bucket. $files=dir $path -recurse | Select Fullname,CreationTime,LastWriteTime,Length, @{Name=«Age»;Expression={(Get-Date)-$_.LastWriteTime}}, @{Name=«Days»;Expression={[int]((Get-Date) -$_.LastWriteTime).TotalDays}} $hash=@{ Path=$path Over= ($files | Where {$_.Days -gt 365} | Measure-Object).Count '365Days'= ($files | Where {$_.Days -gt 180 -AND $_.Days -le 365} | Measure-Object).Count '180Days'= ($files | Where {$_.Days -gt 90 -AND $_.Days -le 180} | Measure-Object).Count '90Days'= ($files | Where {$_.Days -gt 30 -AND $_.Days -le 90} | Measure-Object).Count '30Days'= ($files | Where {$_.Days -gt 7 -AND $_.Days -le 30} | Measure-Object).Count '7Days'= ($files | Where {$_.Days -gt 0 -AND $_.Days -le 7} | Measure-Object).Count } New-Object -TypeNamePSObject -Property $hash | Select Path,Over,365Days,180Days,90Days,30Days,7Days
Листинг 6. Создание, изменение и применение правила доступа
$sb={ Param($path) $du=new-object System.Security.AccessControl.FileSystem AccessRule «jdhlabdomain users»,«Modify»,«allow» $acl = Get-ACL $path $acl.AddAccessRule($du) Set-Acl -Path $path -AclObject $acl }
Листинг 7. Настройка общего ресурса
PS C:> Set-SmbShare -Name Files -EncryptData $True -FolderEnumerationModeAccessBased -CachingMode Documents -CimSession SRV2K12RC Confirm Are you sure you want to perform this action? SRV2K12RC: Performing operation 'Modify' on Target '*,Files'. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is «Y"):
Листинг 8. Удаление общего ресурса
PS C:> Remove-SmbShare -Name Files -CimSession SRV2K12RC Confirm Are you sure you want to perform this action? SRV2K12RC: Performing operation 'Remove-Share' on Target '*,Files'. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is»Y«):
Листинг 9. Создание общего ресурса и установка прав NTFS
Workflow New-FileShare { Param( [string]$Name, [string]$Path, [string]$Principal, [string]$Right=»Modify« ) #This must be done first. Sequence { #create the folder Write-Verbose -Message»Creating new folder $path on $pscomputername« $newfolder = New-Item -Path $path -ItemType Directory } #Then this step can happen. Sequence { Parallel { #these commands can happen in parallel InlineScript { Write-Verbose -Message»Modifying NTFS permissions« Write-Verbose -Message»Creating entry for $using:principal with a right of $using:Right« $entry=New-Object -typenameSystem.Security . AccessControl.FileSystemAccessRule -argumentlist $using:Principal,$using:Right,»allow« #get the existing ACL $acl = Get-ACL -path $using:path #add the new entry $acl.AddAccessRule($entry) Write-Verbose -Message»Applying the new ACL« Set-Acl -Path $using:path -AclObject $acl } #inline #Create the share. Write-Verbose -message»Creating the file share $name« $newshare = New-SmbShare -Name $name -Path $path -Description»File share for $principal«-EncryptData $True -FolderEnumerationModeAccessBased -CachingMode Documents -FullAccess»$env:userdomaindomain admins« -ChangeAccess $Principal } #Parallel } #sequence #Get results. Sequence { Parallel { Write-Verbose -Message»Getting the new share« Get-SmbShare -Name $name Write-Verbose -Message»Getting the new share access" Get-SmbShareAccess -Name $name } }
Управление файловыми серверами с помощью Windows Powershell
Поделитесь материалом с коллегами и друзьями
powershell — Поиск даты изменения файла / папки
Переполнение стека- Товары
- Клиенты
- Случаи использования
- Переполнение стека Публичные вопросы и ответы
- Команды Частные вопросы и ответы для вашей команды
- предприятие Частные вопросы и ответы для вашего предприятия
- работы Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимать технический талант
- реклама Связаться с разработчиками по всему миру
- Товары
- Клиенты
- Случаи использования
- Переполнение стека Публичные вопросы и ответы
- Команды Частные вопросы и ответы для вашей команды
- предприятие Частные вопросы и ответы для вашего предприятия
- работы Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимать технический талант
- реклама Связаться с разработчиками по всему миру
Загрузка…
- Авторизоваться зарегистрироваться
- Товары
- Клиенты
- Случаи использования
- Переполнение стека Публичные вопросы и ответы
- Команды Частные вопросы и ответы для вашей команды
- предприятие Частные вопросы и ответы для вашего предприятия
- работы Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимать технический талант
- реклама Связаться с разработчиками по всему миру
Загрузка…
- Авторизоваться
Каждый день системным администраторам приходится выполнять различные стандартные операции с многочисленными файлами и папками на своих серверах Windows. Эти задачи часто включают в себя управление данными пользователей на общих ресурсах и правильное ведение резервных копий. Вы можете использовать PowerShell, чтобы уменьшить количество ручной работы.
Прежде чем начать, убедитесь, что ваша системная политика позволяет запускать сценарии PowerShell, как описано в «Учебнике по сценариям Windows PowerShell для начинающих».”
Часто задаваемые вопросы
Как я могу создать файл?
Используйте командлет New-Item для создания файла:
New-Item -Path '\\ fs \ Shared \ NewFolder \ newfile.txt' -ItemType File
Создание файла перезаписывает любой существующий файл с тем же именем, поэтому вам может понадобиться проверить, существует ли файл.
Командлет New-Item также можно использовать для создания папок, каталогов или разделов реестра.
Как создать текстовый файл
Чтобы создать новый объект с помощью Windows PowerShell, используйте командлет New-Item и укажите тип элемента, который вы хотите создать, например:
New-Item -Path '\\ фс \ Shared \ NewFolder \ NewFile.txt '-ItemType File
Командлет New-Item можно использовать для создания файлов, папок, каталогов и разделов реестра.
Как создать каталог
Чтобы создать новый каталог с помощью PowerShell, используйте командлет New-Item:
New-Item -Path '\\ fs \ Shared \ NewFolder' -ItemType Directory
Вы также можете использовать командлет New-Item для создания файлов, папок или разделов реестра
Как удалить файл?
Чтобы удалить объект, используйте командлет Remove-Item.Подтверждение будет запрошено после выполнения, если объект не пустой.
Remove-Item -Path '\\ fs \ shared \ it \'
Вы также можете удалить все файлы старше X дней или удалить файлы с нескольких компьютеров с помощью PowerShell.
Как скопировать файл?
Используйте командлет Copy-Item для копирования объектов из одного пути в другой. Следующая команда создает резервную копию путем копирования файла users.xlsx с одного удаленного компьютера (fs) и другого (fs2) по сети:
Copy-Item -Path \\ fs \ Shared \ it \ users.xlsx -Destination \\ fs2 \ Backups \ it \ users.xlsx
Обратите внимание, что если целевой файл уже существует, попытка копирования завершится неудачно. Узнайте, как перезаписать файлы при копировании с или на удаленный компьютер.
Как переместить файл?
Командлет Move-Item перемещает элемент, включая его свойства, содержимое и дочерние элементы, из одного расположения в другое:
Move-Item -Path \\ fs \ Shared \ Backups \ 1.bak -Destination \\ fs2 \ Резервные копии \ архив \ 1.bak
Вы также можете переместить всю папку с помощью PowerShell.
Как переименовать файл?
Чтобы переименовать один файл с помощью PowerShell, используйте следующую команду:
Rename-Item -Path "\\ fs \ Shared \ temp.txt" -NewName "new_temp.txt"
Вы также можете переименовать несколько файлов с помощью PowerShell ,
Просмотр объектов в каталоге
Чтобы просмотреть содержимое каталога на файловом сервере Windows, используйте командлет Get-ChildItem. Чтобы показать все скрытые файлы, добавьте параметр -Force. Команда ниже показывает все корневые объекты в общей папке:
Get-ChildItem -Force \\ fs \ Shared
Если вы также хотите проверить все подпапки и их содержимое, добавьте параметр -Recurse:
Get-ChildItem -Force \\ fs \ Shared -Recurse
Чтобы отфильтровать выходные данные, добавьте параметры Filter, Exclude, Include и Path в командлет Get-ChildItem.Для расширенной фильтрации объектов используйте командлет Where-Object. Приведенный ниже скрипт выполняет поиск всех исполняемых файлов в папке IT, которые были изменены после 1 апреля 2018 года:
Get-ChildItem -Path \\ fs \ Shared \ IT -Recurse -Include * .exe | Where-Object -FilterScript {($ _. LastWriteTime -gt '2018-04-01')}
Создание файлов и папок с помощью PowerShell
Для создания новых объектов с помощью Windows PowerShell вы можете использовать командлет New-Item и указать тип элемента, который вы хотите создать, например, каталог, файл или раздел реестра.
Например, эта команда создает папку:
New-Item -Path '\\ fs \ Shared \ NewFolder' -ItemType Directory
И эта команда создает пустой файл:
New-Item -Path '\\ fs \ Shared \ NewFolder \ newfile.txt '-ItemType File
Создание файлов и запись в них данных
Существует как минимум два встроенных метода для создания файла и записи в него данных. Во-первых, используйте командлет Out-File:
$ text = 'Hello World!' | Out-File $ text -FilePath C: \ data \ text.txt
Чтобы перезаписать существующий файл, используйте параметр -Force switch.
Вы также можете создавать файлы с помощью командлета Export-Csv, который экспортирует выходные данные в файл CSV, который можно открыть в Excel:
Get-ADuser -Filter * | Export-Csv -Path C: \ data \ ADusers.csv
Создайте файлы после проверки того, что они уже не существуют
Следующий скрипт проверяет, существует ли уже определенный файл (pc.txt) в определенной папке; если нет, он генерирует список всех компьютеров AD и сохраняет его в новый файл с именем pc.txt:
# создать массив текстовых файлов $ files = Get-ChildItem C: \ data \ *. txt | выберите -expand полное имя # проверить, если файл существует внутри массива $ files -match "pc.txt" # Если поиск совпадает, верните ключ «True», затем выйдите, если «False», создайте отчет if ($ files -eq 'False') { Get-ADComputer -Filter * | Export-Csv -Path C: \ data \ pc.txt } else {exit}
Удаление файлов и папок с помощью PowerShell
Чтобы удалить объекты, используйте командлет Remove-Item. Обращаем ваше внимание на то, что требуется подтверждение при выполнении, если объект не пустой.В приведенном ниже примере показано, как удалить папку IT, а также все подпапки и файлы в ней:
Remove-Item -Path '\\ fs \ shared \ it \' Подтверждение Элемент в \\ pdc \ shared \ имеет дочерних элементов, а параметр Recurse не был указано. Если вы продолжите, все дети будут удалены с предметом. Ты уверены, что хотите продолжить? [Y] Да [A] Да для всех [N] Нет [L] Нет для всех [S] Приостановить [?] Помощь (по умолчанию «Y»):
Если вы уже убедились, что каждый объект в папке должен быть удален, вы можете использовать переключатель? Recurse, чтобы пропустить шаг подтверждения:
Remove-Item -Path '\\ fs \ shared \ it \ '-Recurse
Удаление файлов и папок старше X дней
Иногда вам нужно очистить старые файлы из определенного каталога.Вот способ сделать это:
$ Папка = "C: \ Backups" # удалить файлы старше 30 дней Get-ChildItem $ Папка -Recurse -Force -ea 0 | ? {! $ _. PsIsContainer -and $ _. LastWriteTime -lt (Get-Date) .AddDays (-30)} | ForEach-Object { $ _ | дель-Форс $ _. FullName | Исходный файл C: \ log \ delebackups.txt -Append } # удалить пустые папки и подпапки, если они есть Get-ChildItem $ Папка -Recurse -Force -ea 0 | ? {$ _. PsIsContainer -eq $ True} | ? {$ _. getfiles (). count -eq 0} | ForEach-Object { $ _ | дель-Форс $ _.FullName | Исходный файл C: \ log \ delebackups.txt -Append }
Удалить файлы после проверки их существования
Вот как проверить, существует ли файл и удалить его, если он существует:
$ FileName = 'C: \ data \ log.txt' If (Test-Path $ FileName) { Remove-Item $ FileName }
Удаление файлов с нескольких компьютеров одним скриптом
Чтобы удалить файлы с удаленных компьютеров, у вас должны быть соответствующие разрешения безопасности для доступа к ним. Обязательно используйте UNC-пути, чтобы скрипт правильно разрешал расположение файлов.
$ filelist = @ ("\ c $ \ Temp", "\ c $ \ Backups") # можно удалить файлы и папки $ computerlist = Get-Content C: \ data \ pc.txt # получить список удаленных компьютеров foreach ($ computer в $ computerlist) { foreach ($ file in $ filelist) { $ filepath = Join-Path "\\ $ computer \" "$ filelist" # генерировать unc пути к файлам или папкам if (Test-Path $ filepath) { Remove-Item $ filepath -force -recurse -ErrorAction Continue}}}
Копировать файлы и папки с помощью PowerShell
Командлет Copy-Item позволяет копировать объекты из одного пути в другой.Следующая команда создает резервную копию путем копирования файла users.xlsx с одного удаленного компьютера (fs) и сохранения его на другом (fs2) по сети:
Copy-Item -Path \\ fs \ Shared \ it \ users.xlsx -Destination \\ fs2 \ Backups \ it \ users.xlsx
Если целевой файл уже существует, попытка копирования завершится неудачно. Чтобы перезаписать существующий файл, даже если он находится в режиме только для чтения, используйте параметр -Force:
Copy-Item -Path \\ fs \ Shared \ it \ users.xlsx -Destination \\ fs2 \ Backups \ it \ пользователи.xlsx -Force
Копирование файлов с помощью PowerShell на или с удаленного компьютера.
Если вы копируете файлы на или с удаленных компьютеров, обязательно используйте пути UNC.
Например, используйте эту команду для копирования файлов с удаленного файлового сервера в локальный каталог C:
Copy-Item \\ fs \ c $ \ temp -Recurse C: \ data \
Чтобы скопировать файлы из вашего локальный каталог к удаленной папке, просто поменяйте местами источник и место назначения:
Copy-Item C: \ data \ -Recurse \\ fs \ c $ \ temp
Скопируйте несколько файлов с одного сервера на другой по сети в одном скрипт
Вы также можете копировать файлы с одного удаленного сервера на другой.Следующий скрипт рекурсивно копирует папку \\ fs \ Shared \ temp в \\ fs \ Shared \ test:
Copy-Item \\ fs \ Shared \ temp -Recurse \\ fs \ Shared \ test
Копировать только определенные типы of
Чтобы скопировать только определенные файлы из исходного содержимого в место назначения, используйте параметр -Filter. Например, следующая команда копирует только текстовые файлы из одной папки в другую:
Copy-Item -Filter * .txt -Path \\ fs \ Shared \ it -Recurse -Destination \\ fs2 \ Shared \ text
Копировать файлы использование команд XCOPY и ROBOCOPY или COM-объектов
Вы также можете запускать команды XCOPY и ROBOCOPY для копирования файлов или использовать COM-объекты, как показано в следующем примере:
(New-Object -ComObject Scripting.FileSystemObject) .CopyFile ('\\ fs \ Shared', 'fs2 \ Backup')
Перемещение файлов и каталогов с помощью PowerShell
Командлет Move-Item перемещает элемент, включая его свойства, содержимое и дочерние элементы, из одного Ещё одно место. Он также может перемещать файл или подкаталог из одного каталога в другое место.
Следующая команда перемещает определенный файл резервной копии из одного места в другое:
Move-Item -Path \\ fs \ Shared \ Backups \ 1.bak -Destination \\ fs2 \ Backups \ archive \ 1.bak
Этот сценарий перемещает всю папку «Резервные копии» и ее содержимое в другое место:
Move-Item -Path \\ fs \ Shared \ Backups -Destination \\ fs2 \ Backups \ archive
Каталог резервных копий и все его файлы и вложенные папки появятся в каталоге архива.
Переименование файлов с помощью PowerShell
Командлет Rename-Item позволяет изменять имя объекта, оставляя его содержимое без изменений. Невозможно перемещать элементы с помощью команды Rename-Item; для этой функции вы должны использовать командлет Move-Item, как описано выше.
Следующая команда переименовывает файл:
Rename-Item -Path "\\ fs \ Shared \ temp.txt" -NewName "new_temp.txt"
Переименование нескольких файлов
Чтобы переименовать несколько файлов одновременно, используйте команду скрипт такой:
$ files = Get-ChildItem -Path C: \ Temp #создать список файлов foreach ($ file в $ files) { $ newFileName = $ file.Name.Replace ("A", "B") # заменить "A" на "B" Переименовать элемент $ file $ newFileName }
Изменение расширений файлов с помощью PowerShell
Вы также можете использовать Rename-Item для изменения расширений файлов.Если вы хотите изменить расширения нескольких файлов одновременно, используйте командлет Rename-Item с командлетом Get-ChildItem.
Следующий скрипт изменяет все расширения файла «txt» на «bak». Подстановочный знак (*) обеспечивает включение всех текстовых файлов:
Get-ChildItem \\ fs \ Shared \ Logs \ *. Txt | Rename-Item -NewName {$ _. Name -Replace '\ .txt $', '. Bak'}
Используя информацию из этой статьи, вы можете автоматизировать различные простые операции, связанные с управлением файлами в ваших хранилищах файлов и сэкономить время для более важных задач.Удачи!
.