Числа — это сила. Одна из новых возможностей версии 2 продукта Windows PowerShell – поддержка транзакций. Вообще говоря, транзакция – это несколько дискретных операций, которые должны быть выполнены все целиком и успешно, либо все не выполнены.
Допустим, вы создаете набор команд, которые изменяют несколько параметров реестра. Один из параметров изменить не удается из-за недостатка разрешений или по иной причине. В этом случае вообще не нужно вносить никаких изменений в реестр. Надо, чтобы изменения вносились в реестр только в том случае, когда удается успешно внести все эти изменения без исключения. Именно такое поведение позволяют реализовать транзакции оболочки PowerShell.
Что нам потребуется
В Windows PowerShell версии 2 транзакции доступны только в ОС Windows Vista, Windows Server 2008 и более поздних версиях Windows. Хотя PowerShell версии 2 может работать в таких более старых операционных системах, как Windows XP и Windows Server 2003, поддержка транзакций на эти версии не распространяется.
Это становится правилом для Windows PowerShell: новые версии оболочки могут работать в старых ОС, но некоторые функции в них недоступны.
Поддержка транзакций в оболочке реализована через поставщиков PSDrive. PSDrive представляет хранилище — например, реестр или файловую систему — в виде обычной дисковой файловой системы. Поставщик PSDrive должен поддерживать транзакции. В версии 2 оболочки по умолчанию транзакции поддерживает только поставщик реестра.
Оболочка также позволяет другим командлетам поддерживать транзакции, для этого в транзакции нужно включать параметр -UseTransaction. По существу, оболочка предоставляет каркас для поддержки транзакций. Отдельные командлеты или поставщик PSDrive должны реализовывать эту поддержку.
Открытие транзакции
Открыть транзакцию можно, просто выполнив команду Start-Transaction. Если не задать никаких параметров и в данный момент не выполняется никакой транзакции, будет создана новая транзакция. Если командлет запустить во время выполнения другой транзакции, вы просто подключитесь к имеющейся транзакции, а не запустите новую.
Команда Start-Transaction –independent создаст новую, независимую транзакцию и сделает ее активной. Можно запустить много транзакций, но в каждый момент времени может быть активной только одна из них. Таким образом создается иерархия транзакций:
- Транзакция 1 (Start-Transaction)
- Транзакция 2 (Start-Transaction –independent)
- Транзакция 3 (Start-Transaction –independent)
Если активна Транзакция 3, то все выполненные в ней допустимые команды становятся частью этой транзакции. По завершении Транзакции 3, путем отката или фиксации, становится активной Транзакция 2. Хотя активной может быть только одна транзакция, взаимозависимости транзакций не отслеживаются. Иначе говоря, если завершить Транзакцию 3, но прервать Транзакцию 2, все зафиксированное в Транзакции 3 останется.
Команда Get-Transaction позволяет в любой момент времени узнать, какие транзакции активны. По умолчанию транзакция автоматически откатывается (подробнее об этом чуть позже) в случае ошибки какого-либо командлета этой транзакции; можете задать дополнительные параметры отката в параметрах командлета Start-Transaction.
Использование транзакций
При запуске транзакции нужно явно прикрепить к ней команды параметром -UseTransaction. Даже если командлет поддерживает транзакции, автоматически он их использовать не будет. Нужно определить указанный параметр, чтобы операция попала в транзакцию, например так:
Cd hkcu:\software
Mkdir test
Start-transaction
Del test –usetransaction
Dir
Каталог будет содержать параметр реестра test. Хотя параметр и удален, удаление выполнено в составе транзакции, которая еще не зафиксирована. Выполнив команду Dir –usetransaction, вы увидите каталог в том состоянии, в котором он существует в транзакции. Параметра test там нет.
Закрытие транзакции и рекомендации по транзакциям
Закрыть транзакцию можно одним из двух способов:
- командой Undo-Transaction, которая откатит все команды, выполненные в рамках транзакции;
- командой Complete-Transaction, которая зафиксирует все изменения, выполненные в рамках транзакции.
Командлет Use-Transaction позволяет выполнить любую команду в рамках транзакции, однако можно использовать только команды, в которых работают с поддерживающими транзакции объектами Microsoft .NET Framework. Нельзя подсунуть абы какую старую команду и ждать, что это будет работать. Дополнительную информацию можно получить, выполнив команду Help about_transactions.
Сейчас возможность использования транзакций в реестре кажется не сильно полезной. Базовая поддержка транзакций в файловой системе уже есть, но PSDrive-поставщик файловой системы пока транзакции не поддерживает. Похоже, что в Microsoft склоняются к тому, чтобы сделать больше объектов .NET Framework, поддерживающих транзакции, — именно с такими объектами работает Windows PowerShell. В будущем, возможно, мы сможем выполнять операции в Active Directory в рамках транзакций.
Есть хорошие новости: оболочка уже поддерживает транзакции с разнородными объектами. Иначе говоря, если бы файловая система поддерживала транзакции (а это наверняка когда-то произойдет), в одной транзакции можно было бы совмещать файловые операции и операции с реестром, что было бы действительно очень полезно.
Материалы по теме