Powershell изменить атрибуты файла
Creates or changes the value of a property of an item.
Description
The Set-ItemProperty cmdlet changes the value of the property of the specified item. You can use the cmdlet to establish or change the properties of items. For example, you can use Set-ItemProperty to set the value of the IsReadOnly property of a file object to $True .
You also use Set-ItemProperty to create and change registry values and data. For example, you can add a new registry entry to a key and establish or change its value.
Использование масок для копирования и перемещения
Во многих командах Powershell доступны следующие специальные символы:
- * - говорит, что в этом месте есть неизвестное количество неизвестных символов;
- ? - в этом месте есть один неизвестный символ;
- [A,B,C] - в этом месте есть одна из следующих букв A,B,C.
Например так мы скопируем все объекты с расширением 'txt' из одной папки в другую:
Перемещение сработает так же.
Предыдущий вариант сработает, если мы ищем файлы в текущей директории. Для копирования в Powershell внутри всех вложенных каталогов нужно использовать рекурсивный поиск, который доступен только в Copy-Item. Рекурсивный поиск устанавливается ключом Recurse. В следующем примере будет найден и скопирован файл hosts. В качестве * я указал один из элементов неизвестного пути:
Включение или отключение наследования папок и файлов
Для управления наследованием используется метод "SetAccessRuleProtection", который устанавливает следующее:
- Нужно ли блокирование от родительской папки.
- Нужна ли перезапись прав.
Значения указываются в $True или $False. Например так я включу наследование и заменю существующие разрешения родительскими:
Выполнение команд под другим пользователем
Любая команда выполняется от имени пользователя, который открыл консоль Powershell. Хоть в командах и присутствует параметр 'Credential', но при его использовании вы будете получать ошибку:
- The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again without specifying credentials.
Есть несколько способов обойти эти ограничения использовав методы WMI и CIM. В Powershell так же доступен сервис PSRemoting, который создан для выполнения задач удаленно. Мы можем использовать две команды:
- New-PSItem - подключение к компьютеру и дальнейшая работы с ним;
- Invoke-Command - одноразовое выполнение команды.
Этот сервис может не работать по умолчанию и нуждаться в дополнительных настройках. Этот процесс был описан в другой статье.
В следующем примере будет объявлена переменная в которой будет храниться логин и пароль нужной учетной записи:
После заполнения этой переменной нужно будет передать ее в параметр Credential. Примеры по работе с файлами удаленно от другого пользователя:
Основной способ ограничения доступа к файлам и папкам дает файловая система NTFS с ее таблицами ACL. Это может быть право только на чтение файла (открытие и просмотр), на чтение и запись (открытие, просмотр, изменение и сохранение) и многие другие. Такие права мы чаще устанавливаем через GUI назначая права не конечному пользователю, а группе в которой он состоит. Все действия по созданию и изменению мы так же можем сделать через Powershell.
Навигация по посту
На мой взгляд использование консоли Powershell лишнее при выдаче таких прав. Риск совершить ошибку в консоли намного выше, чем при работе в GUI, да и время для написания команды уйдет больше. Есть специфичные задачи, например в виде аудита или перенос прав где Powershell очень поможет.
Основы разрешений
ACL (access controll list) - делится на два вида:
- SACL (System Access Control List) - используется для аудита;
- DACL (Discretionary Access Control List) - используется для выдачи и проверки разрешений пользователям и группам.
Оба этих типа разрешений хранятся в специальной таблице MFT (Master File Table).
Основное средство для редактирования этих разрешений в GUI можно увидеть зайдя в свойства файла или папки:
В области 4 выделены следующие разрешения:
- Read - открытие файла и папки;
- List folder contents - открытие папки;
- Write - создание файлов и папок и их изменение;
- Read & Execute - открытие и запуск исполняемых файлов;
- Modify - открытие, создание, изменение и удаление файлов и папок;
- Full Control - включает разрешения modify, а так же управление разрешениями файла или папки.
Чаще всего мы работаем с разрешениями выше, но есть еще один список с возможностью настройки прав более тонко:
Как можно догадаться - разрешения указанные в области 1 это просто набор нескольких правил из области 3. Их так же еще называют "Premission Sets" и "Special Premissions".
Групповые разрешения могут принимать флаги Allow и Deny, которые разрешат или запретят указанные действия. Указывать разрешения для пользователей через Deny считается плохой практикой и практически не используется.
Кроме этого существует наследование:
Наследование помогает установить разрешения для одной папки так, что оно будет применяться ко вложенным файлам и папкам. Если наследование отключить (2), то у нас будет возможность убрать все наследуемые разрешения или оставить их.
Функции по работе со строками в Powershell
Создание со вложенными директориями
Мы можем создать множество папок не указывая дополнительных параметров:
Если мы захотим создать директорию и файл, то получим ошибку:
Мягкие и жесткие ссылки
Кроме файлов и директорий в ItemType можно указать следующие типы ссылок:
- SymbolicLink (мягкая ссылка) - обычный ярлык на папку или директорию;
- Junction - старый тип ссылок (до Windows Vista);
- HardLink (жесткая ссылка) - ссылка на объект в файловой системе. Не работает с директориями.
Каждый файл можно представить как ссылку на объект файловой системы. Ярлык устанавливает связь с именем файла (ссылка на ссылку). При переименовании оригинального файла или его удалении ярлык перестает работать.
Жесткая ссылка работает иначе. Она ссылается на объект файловой системы, а не на имя. Поэтому при удалении или переименовании оригинального файла эта связь не потеряется. Такие ссылки можно представить как копии оригинальных фалов, но которые не занимают дополнительное место на диске. Жесткие ссылки работают в рамках одного раздела и их нельзя использовать на каталогах. Сам объект файловой системы (файл) будет существовать до последней такой ссылки.
В следующем примере я создаю жесткую ссылку, где 'old_file.txt' - имя существующего файла, а 'new_link.txt' - имя нового:
Изменение атрибутов файла Powershell
Например я хочу изменить свойство файла в powershell и поставить "только чтение". Для этого мне нужно получить всех участников объекта и присвоить значение:
Для изменения я должен вызвать свойство и присвоить $true или $false т.к. значения принимаются только типа bool:
Мы можем изменить так же время создания файла в powershell:
Если мы хотим изменить атрибуты объекта, которые не видны в Property, то мы можем сделать так:
Если мы захотим добавить какое-то атрибут, то мы должны будем перечислить их все. Иначе они уберутся:
Можно сделать так:
Таким образом мы сложим существующие атрибуты с новым.
Что бы увидеть все значения, которые мы можем записать в атрибут можно выполнить:
- ReadOnly
- Hidden
- System
- Directory
- Archive
- Device
- Normal
- Temporary
- SparseFile
- ReparsePoint
- Compressed
- Offline
- NotContentIndexed
- Encrypted
- IntegrityStream
- NoScrubData
Часть атрибутов мы можем изменять так:
Если нам нужно изменить атрибуты множества объектов, то можно сделать так:
Для работы с файлами в Powershell есть около 10 команд. С помощью команды New-Item можно создать файл или папку в Powershell, жесткую и мягкую ссылку. Copy-Item и Move-Item выполняют копирование и перемещение объектов. В этой стать мы рассмотрим все эти операции, а так же удаление директорий и файлов включая сетевые пути, на примерах.
Навигация по посту
Дополнительные параметры фильтрации
Если предыдущих примеров, где мы находили файлы с неизвестным название, не достаточно, то можно использовать дополнительные параметры. Они доступны в обеих командах Copy-Item и Move-Item:
- Include - включает объекты с этим упоминанием;
- Exclude - работает аналогично предыдущему, но исключает объекты;
- Filter - включает объекты указанные в этом параметре.
Я не вижу смысла использовать все параметры описанные выше в одной команде, но в них есть отличия. Filter будет работать быстрее, так как он работает и фильтрует данные в момент их получения. Include и Exclude сработают после получения всех файлов, но каждое значение для них можно указывать через запятую. Для Include и Exclude так же важно указывать Path с '*' в конце, например 'C:\dir\*'.
Например мы хотим скопировать все объекты с расширением 'txt' и 'jpg'. Это можно сделать так:
Я бы не рекомендовал использовать Filter в обеих командах. Более удобный способ - это искать файлы с Get-ChildItem, а затем их копировать и перемещать в нужное место. В следующем примере будут перенесены все объекты формата '.txt' и '.jpg' в каталог Directory:
Создание и изменение в Powershell NTFS разрешений ACL
Parameters
Prompts you for confirmation before running the cmdlet.
Type: | SwitchParameter |
Aliases: | cf |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
This parameter is not supported by any providers installed with PowerShell. To impersonate another user, or elevate your credentials when running this cmdlet, use Invoke-Command.
Type: | PSCredential |
Position: | Named |
Default value: | Current user |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Specifies, as a string array, an item or items that this cmdlet excludes in the operation. The value of this parameter qualifies the Path parameter. Enter a path element or pattern, such as *.txt . Wildcard characters are permitted. The Exclude parameter is effective only when the command includes the contents of an item, such as C:\Windows\* , where the wildcard character specifies the contents of the C:\Windows directory.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Specifies a filter to qualify the Path parameter. The FileSystem provider is the only installed PowerShell provider that supports the use of filters. You can find the syntax for the FileSystem filter language in about_Wildcards. Filters are more efficient than other parameters, because the provider applies them when the cmdlet gets the objects rather than having PowerShell filter the objects after they are retrieved.
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Forces the cmdlet to set a property on items that cannot otherwise be accessed by the user. Implementation varies from provider to provider. For more information, see about_Providers.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies, as a string array, an item or items that this cmdlet includes in the operation. The value of this parameter qualifies the Path parameter. Enter a path element or pattern, such as "*.txt" . Wildcard characters are permitted. The Include parameter is effective only when the command includes the contents of an item, such as C:\Windows\* , where the wildcard character specifies the contents of the C:\Windows directory.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Specifies the object that has the properties that this cmdlet changes. Enter a variable that contains the object or a command that gets the object.
Type: | PSObject |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Specifies a path to one or more locations. The value of LiteralPath is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single quotation marks. Single quotation marks tell PowerShell not to interpret any characters as escape sequences.
Type: | String [ ] |
Aliases: | PSPath, LP |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Specifies the name of the property.
Type: | String |
Aliases: | PSProperty |
Position: | 1 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Returns an object that represents the item property. By default, this cmdlet does not generate any output.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the path of the items with the property to modify. Wildcard characters are permitted.
Type: | String [ ] |
Position: | 0 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | True |
Type is a dynamic parameter that the Registry provider adds to the Set-ItemProperty cmdlet. This parameter only works in the registry drives.
- String : Specifies a null-terminated string. Used for REG_SZ values.
- ExpandString : Specifies a null-terminated string that contains unexpanded references to environment variables that are expanded when the value is retrieved. Used for REG_EXPAND_SZ values.
- Binary : Specifies binary data in any form. Used for REG_BINARY values.
- DWord : Specifies a 32-bit binary number. Used for REG_DWORD values.
- MultiString : Specifies an array of null-terminated strings terminated by two null characters. Used for REG_MULTI_SZ values.
- Qword : Specifies a 64-bit binary number. Used for REG_QWORD values.
- Unknown : Indicates an unsupported registry data type, such as REG_RESOURCE_LIST values.
Specifies the value of the property.
Type: | Object |
Position: | 2 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Shows what would happen if the cmdlet runs. The cmdlet is not run.
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Получение текущих разрешений в Powershell
На примере ниже я верну разрешения для папки "C:\TestFolder\"
В области 1 выделен владелец папки, а под областью 2 отображаются все группы и пользователи с правами.
Мы можем проверять права не только локальной, но и сетевой папки. На примере ниже возвращена та же папка:
Перезапись
Ключ Force не только создает родительские объекты в виде папок, но и перезаписывает файлы. Если не указан параметр Force, а файл или папка уже существует - вы получите ошибки:
- New-Item : The file 'C:\Dir1\Dir2\Dir3\file.txt' already exists.
- New-Item : An item with the specified name C:\Dir1\Dir2\Dir3\ already exists.
Указывая Force - файлы перезаписываются удаляя все содержимое. В случае с папками ничего удалено не будет.
Notes
Set-ItemProperty is designed to work with the data exposed by any provider. To list the providers available in your session, type Get-PSProvider . For more information, see about_Providers.
Атрибуты файла Powershell можно получить несколькими способами, все зависит от ситуации. В powershell все что мы получаем является объектами, а у объектов есть "участники"(member), которые делятся на свойства и методы. Под атрибутами обычно и подразумевают свойства, а под методами действия типа запись или удаление.
Для получения свойств файла powershell мы можем выполнить следующую команду:
Таким образом у нас выводятся все свойства:
Навигация по посту
Мы можем и методы и свойства в powershell использую другой командлет:
Для получение свойства объекта мне легче всего объявить переменную и вызвать так:
Удаление прав у пользователя или группы
Для удаления всех разрешений есть метод "RemoveAccessRuleAll". Работает он так же:
Для удаления конкретного права, например только возможность чтения, есть метод "RemoveAccessRule". С этим методом у меня были проблемы после которых действующие разрешения менялись на Special и изменить эту ситуацию у меня не получилось. Если вам нужно все же убрать одно разрешение - я бы советовал удалять все разрешения у пользователя, а затем добавлять их заново. У пользователя было право на Чтение и Запись, но мне нужно было оставить только чтение:
Смена владельца
Смена владельца файла или папки делается через метод SetOwner. Этот метод, в качестве идентификатора, принимает SID пользователя и что бы его узнать нужно использовать класс "System.Security.Principal.Ntaccount". На практике это выглядит так:
Как отсортировать в Powershell объекты через Sort-Object
Изменение, копирование и добавление разрешений
Еще одна причина использовать Powershell - это возможность копирования разрешений. Например так я поставлю разрешения для папки Folder2 такие же, как и Folder2:
Возможности добавить нового пользователя в список ACL или изменить его права одним командлетом у нас нет. В обоих случаях мы должны будет создавать копию объекта ACL, изменять ее отдельным классом, а затем применять используя метод. Сам объект, который мы получаем через Get-ACL, имеет множество методов:
Для создания нового объекта с правами используется класс "FileSystemAccessRule", который в команде будет выглядеть так:
Расшифровать значения можно следующим образом:
- IdentityReference\String - пользователь или группа формата "DOMAIN\Administrator";
- FileSystemRights - сами разрешения, например "Read";
- InheritanceFlags и PropagationFlags - определяют наследование. Например вы можете сделать так, что папки внутри указанной будут наследовать разрешения, а файлы нет. Ниже будут приведены несколько примеров. Более подробно об этом можно почитать на сайте Microsoft;
- AccessCpmtrolType - разрешить или запретить (Allow/Deny).
Example 1: Set a property of a file
This command sets the value of the IsReadOnly property of the "final.doc" file to "true". It uses Path to specify the file, Name to specify the name of the property, and the Value parameter to specify the new value.
The file is a System.IO.FileInfo object and IsReadOnly is just one of its properties. To see all of the properties, type Get-Item C:\GroupFiles\final.doc | Get-Member -MemberType Property .
The $true automatic variable represents a value of "TRUE". For more information, see about_Automatic_Variables.
Outputs
None, System.Management.Automation.PSCustomObject
This cmdlet generates a PSCustomObject object that represents the item that was changed and its new property value, if you specify the PassThru parameter. Otherwise, this cmdlet does not generate any output.
Запись данных
Еще один из способа перезаписи файлов в Powershell - использование символа перенаправления вывода '>'. Если объект уже существует - он будет перезаписан, иначе будет создан новый файл:
Почти такой же результат будет если добавить в команду параметр Value. Результат следующего примера будет аналогичен предыдущему:
Удаление
В следующем примере мы удалим файл:
Пустые каталоги в Powershell удаляются так же. Если в папке находятся другие файлы будет запрошено разрешение на удаление.
Избежать таких вопросов можно использовав рекурсию в виде параметра Recurse:
Если нужно удалить все файлы внутри каталога, то нужно добавить знак '*'. Если внутри каталога будут находится другие папки с файлами, то запросится подтверждение:
У команды есть параметры, описанные ранее, в виде:
Поиск всех папок с правами у определенной группы
Представим, что мы хотим проверить права данные определенной группе. Мы можем заходить в свойства каждой папки и смотреть вкладку "Безопасности", а можем сделать это через Powershell.
Обычно у нас есть какой-то каталог с общим доступом с папками внутри, на которые мы выдаем разрешения. В моем случае такой каталог "Moscow", а на папки внутри я уже даю права:
В следующем примере я узнаю на какие папки установлены разрешения для TestGroup:
Syntax
Работа с сетевыми папками и SMB
Для копирования и переноса данных по сети нужно использовать следующий формат:
Он сработает со всеми командами, как для источника так и для назначения:
Переименование файлов и директорий
Для переименовывания в Powershell используется Rename-Item. В следующем примере мы укажем новое имя в параметре NewName:
В NewName можно указать путь, но он должен соответствовать источнику. При следующем написании будет ошибка:
- Rename-Item : Cannot rename the specified target, because it represents a path or device name.
Для массового переименовывания объектов можно использовать конвейер с 'Get-ChildItem'. Например нам нужно поменять расширения файлов с ''.jpg" на ".jpg" - это можно сделать так:
Изменение и добавление прав у пользователя и групп
Допустим у нас есть пользователь "Test User (001)" с возможностью чтения папки "Folder1" и мы хотим добавить еще права на запись. Это будет выглядеть так:
Наследование типа 'ContainerInherit, ObjectInherit' говорит о том, что оно касается этой папки и всех вложенных папок и файлов.
Таким же образом работает добавление новой группы или пользователя в список ACL:
Права, которые мы можем дать имеют сокращенное название и они отображены далее:
У вас может быть много ошибок связанных с созданием класса с новыми разрешениями. Я бы советовал выводить существующие права и сравнивал бы их с новыми - это позволит снизить вероятность ошибок.
При этом вы можете применить набор разрешений, например в виде Write, но результат будет отображаться в виде "Special Premission":
Если бы я указал наследование в виде 'ContainerInherit, ObjectInherit', то права бы применились как нужно:
Поэтому я рекомендую смотреть существующие разрешения на примере того, как я сделал это выше.
Example 2: Create a registry entry and value
This example shows how to use Set-ItemProperty to create a new registry entry and to assign a value to the entry. It creates the "NoOfEmployees" entry in the "ContosoCompany" key in HKLM\Software key and sets its value to 823.
Because registry entries are considered to be properties of the registry keys, which are items, you use Set-ItemProperty to create registry entries, and to establish and change their values.
The first command creates the registry entry. It uses Path to specify the path of the HKLM: drive and the Software\MyCompany key. The command uses Name to specify the entry name and Value to specify a value.
The second command uses the Get-ItemProperty cmdlet to see the new registry entry. If you use the Get-Item or Get-ChildItem cmdlets, the entries do not appear because they are properties of a key, not items or child items.
The third command changes the value of the NoOfEmployees entry to 824.
You can also use the New-ItemProperty cmdlet to create the registry entry and its value and then use Set-ItemProperty to change the value.
For more information about the HKLM: drive, type Get-Help Get-PSDrive . For more information about how to use PowerShell to manage the registry, type Get-Help Registry .
Копирование и перемещение папок и файлов
В следующем примере, с помощью Powershell, будет скопирован файл 'C:\data.txt' в директорию 'C:\Catalog\':
Перемещение объектов выполняется так же, но с использованием Move-Item:
Если в перемещаемой папке уже существует файл с этим именем, то мы получим ошибку:
- Move-Item : Cannot create a file when that file already exists
Для исправления этой ситуации можно использовать параметр Force или перемещать файл под другим именем. Новое имя можно указать в Destination:
Каталоги переносятся и копируются так же. Знак '\' в конце Destination говорит, что мы хотим перенести папку внутрь указанной. Отсутствие знака '\' говорит, что это новое имя директории:
Path - принимает список, а это значит, что мы можем указывать несколько значений через запятую.
Создание файлов
В следующем примере мы создадим файл с расширением '.txt':
По умолчанию файл создается в той директории откуда был запущен сам Powershell. Изменить путь создания файла можно указав путь в Path:
Каждая папка так же является файлом, но для ее создания в Powershell нужно указывать тип 'Directory' в 'ItemType':
Сбор всех прав и их экспорт в CSV
Учитывая примеры выше мы можем временно собирать отчеты по выданным правам. Пример того, как может выглядеть отчет:
Summary: Learn how to use the Windows PowerShell cmdlet Set-ItemProperty to work with file attributes.
Hey, Scripting Guy! I often find myself working with file attributes. Our backup program reads the archive flag, and our users are always creating read-only copies of their spreadsheets. I have an old VBScript script that will manipulate file attributes, but I am surprised that Windows PowerShell does not do this. It seems like it should be simple to have a Set-FileAttribute Windows PowerShell cmdlet, but unfortunately it does not seem to exist.
Hello AD,
Microsoft Scripting Guy Ed Wilson here. One of the cool things about being in Florida during the winter is actually a warm thing. Today, it is 71 degrees Fahrenheit (21.6 degrees Celsius according to my conversion module), and it is sunny. It was such a lovely day that Dr. Scripto decided to head down to the harbor to watch the boats coming in and out.
AD, I will leave Dr. Scripto at the waterfront to work on his tan (he really needs to get out more), and I will tackle your question. In September of last year, I wrote How Can I Unlock a Read-Only File, Edit it, and Make it Read-Only Again? In that post, which was awesome, I worked specifically with the read-only attribute. In this article, I will look at a different way of working with file attributes.
PS C:\> Get-PSProvider
Name Capabilities Drives
—- ———— ——
WSMan Credentials
Alias ShouldProcess
Environment ShouldProcess
FileSystem Filter, ShouldProcess
Function ShouldProcess
Registry ShouldProcess, Transactions
Variable ShouldProcess
Certificate ShouldProcess
PS C:\>
PS C:\> Get-ItemProperty -Path C:\fso\a.txt
Directory: C:\fso
Mode LastWriteTime Length Name
—- ————- —— —-
-a— 12/17/2010 5:08 PM 0 a.txt
PS C:\>
PS C:\> Get-ItemProperty -Path C:\fso\a.txt | Format-list -Property * -Force
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\fso\a.txt
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\fso
PSChildName : a.txt
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
VersionInfo : File: C:\fso\a.txt
InternalName:
OriginalFilename:
FileVersion:
FileDescription:
Product:
ProductVersion:
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language:
BaseName : a
Mode : -a—
Name : a.txt
Length : 0
DirectoryName : C:\fso
Directory : C:\fso
IsReadOnly : False
Exists : True
FullName : C:\fso\a.txt
Extension : .txt
CreationTime : 8/17/2009 9:28:43 AM
CreationTimeUtc : 8/17/2009 1:28:43 PM
LastAccessTime : 8/22/2009 6:13:01 PM
LastAccessTimeUtc : 8/22/2009 10:13:01 PM
LastWriteTime : 12/17/2010 5:08:38 PM
LastWriteTimeUtc : 12/17/2010 10:08:38 PM
Attributes : Archive
PS C:\>
PS C:\> Get-ItemProperty -Path C:\fso\a.txt | Get-Member -MemberType property
TypeName: System.IO.FileInfo
Name MemberType Definition
—- ———- ———-
Attributes Property System.IO.FileAttributes Attributes
CreationTime Property System.DateTime CreationTime
CreationTimeUtc Property System.DateTime CreationTimeUtc
Directory Property System.IO.DirectoryInfo Directory
DirectoryName Property System.String DirectoryName
Exists Property System.Boolean Exists
Extension Property System.String Extension
FullName Property System.String FullName
IsReadOnly Property System.Boolean IsReadOnly
LastAccessTime Property System.DateTime LastAccessTime
LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc
LastWriteTime Property System.DateTime LastWriteTime
LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc
Length Property System.Int64 Length
Name Property System.String Name
PS C:\>
That is what I was looking for. Notice that in the definition column some of the properties such as Attributes are listed as and others such as Directory are listed as . Well, if a property is get;set then it is read-write–in other words, I can modify the value. If a property is only get, it is read-only.
PS C:\> (Get-Date).gettype()
IsPublic IsSerial Name BaseType
——– ——– —- ——–
True True DateTime System.ValueType
PS C:\>
PS C:\> [System.Io.FileAttributes] | Get-Member -Static -MemberType property
TypeName: System.IO.FileAttributes
Name MemberType Definition
—- ———- ———-
Archive Property static System.IO.FileAttributes Archive
Compressed Property static System.IO.FileAttributes Compressed
Device Property static System.IO.FileAttributes Device
Directory Property static System.IO.FileAttributes Directory
Encrypted Property static System.IO.FileAttributes Encrypted
Hidden Property static System.IO.FileAttributes Hidden
Normal Property static System.IO.FileAttributes Normal
NotContentIndexed Property static System.IO.FileAttributes NotContentIndexed
Offline Property static System.IO.FileAttributes Offline
ReadOnly Property static System.IO.FileAttributes ReadOnly
ReparsePoint Property static System.IO.FileAttributes ReparsePoint
SparseFile Property static System.IO.FileAttributes SparseFile
System Property static System.IO.FileAttributes System
Temporary Property static System.IO.FileAttributes Temporary
PS C:\>
PS C:\> [enum]::GetValues([system.io.fileattributes])
ReadOnly
Hidden
System
Directory
Archive
Device
Normal
Temporary
SparseFile
ReparsePoint
Compressed
Offline
NotContentIndexed
Encrypted
PS C:\>
Using the Get-EnumValues function from my Enumerations and Values Weekend Scripter post, I obtain the following list of enumerations and their associated values.
Name Value
—- —–
Offline 4096
NotContentIndexed 8192
Device 64
Directory 16
Normal 128
ReparsePoint 1024
Archive 32
Encrypted 16384
SparseFile 512
System 4
Temporary 256
Hidden 2
ReadOnly 1
Compressed 2048
Ok, so far so good. If the attributes were stored as a hash table or as an array, things would be easy. Alas, they are not. They are stored as an old-fashioned bitmask value.
Therefore, to work with them, we need to use old-fashioned techniques, such as the sort thing you learned when you were taking Boolean algebra back at the university. If you are little rusty on your Boolean algebra, you may want to refer to this Hey, Scripting Guy! Blog post. It is sort of like the Karate Kid and “wax on, wax off” only different.
PS C:\> (Get-ItemProperty -Path C:\fso\a.txt).attributes
ReadOnly, Archive
PS C:\>
PS C:\> (Get-ItemProperty -Path C:\fso\a.txt).attributes.Value__
33
PS C:\> [convert]::ToString(33,2)
100001
PS C:\>
Everywhere a file attribute is turned on, a 1 appears. Therefore, the value 32 (archive) appears in the sixth position, and read-only (value of 1) appears in the first position. This behaves in a similar way that figuring out subnet masks works. In the table following this paragraph, the first row is the decimal value of the position. In the second row, is the binary representation of the number 33 that I obtained by using the convert class earlier. In the second row, notice there is a 1 in the 32 column, and a 1 in the 1 column. The third row is the binary value of the number 1 (the value of the read-only enumeration). The fourth row represents the results of performing a binary AND (BAND) operation. When performing a Binary AND operation, the rules are thus: 1 –BAND 1 = 1, 1 –BAND 0 = 0, 0 –BAND 0 = 0.
Создание множества файлов и директорий
Параметр Path может принимать несколько значений. Это значит, что одной командой мы можем создать несколько объектов:
Можно использовать сочетания директорий и файлов, добавляя ключ Force тем самым избегая ошибок.
Открываем файл и читаем его содержимое с Get-Content в Powershell
Inputs
You can pipe objects to this cmdlet.
Examples
Example 3: Modify an item by using the pipeline
Th example uses Get-ChildItem to get the weekly.txt file. The file object is piped to Set-ItemProperty . The Set-ItemProperty command uses the Name and Value parameters to specify the property and its new value.
Читайте также: