Windows PowerShell: Иногда текст лучше всего

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

Дон Джонс

Я целый год отвечал на ваши вопросы по Windows PowerShell, и похоже, что настало время вспомнить некоторые из самых ранних вопросов. Следующий вопрос отлично демонстрирует, как в некоторых случаях Windows PowerShell позволяет быстро решить задачу, а также как иногда выгоднее не слишком много времени тратить на ее обдумывание.

Напомню вопрос. У читателя был XML-файл с комментарием:

<!-- <tag attribute="value">Data</tag> -->

Как видите, XML-тег заключен в теги комментария («<!--» и «-->»). Задача заключалась в удалении знаков комментария, то есть в превращении комментария в активный XML-тег. Читатель попытался использовать для чтения файла командлет Get-Content, но в результате приводил его к типу данных XML в Windows PowerShell:

[xml]$file = Get-Content myfile.xml

Некоторые не понимают этого приема, суть которого в том, что этот командлет заставляет Windows PowerShell — через Microsoft .NET Framework — анализировать XML-файл и строить иерархию объектов, представляющих содержимое XML-файла. Это не сильно отличается от использования Import-CliXML, но в данном случае удается прочитать любой XML-файл правильного формата. Import-CliXML предназначен для чтения особого формата XML, созданного командлетом Export-CliXML.

Короче говоря, проблема с анализом содержимого XML-файла как текста XML может сильно затруднить работу. Чтобы найти и снять комментарии, придется написать немало кода. И лично я не совсем понимаю, как строить такой код.

Прагматичный подход

Давайте я немного отвлеку вас и предложу один философский совет. Когда я занимался разработкой ПО в прошлом, я никогда не был профессиональным, специально обученным разработчиком. В душе я всегда был администратором. Одна из первых моих ИТ-должностей была позиция системного оператора AS/400. Я обнаружил, что администраторы очень прагматичные создания. «Нашел проблему, устранил ее — и с чистой совестью домой», — вот как обычно описывается отношение администраторов к своей работе.

А вот разработчики — идеалисты, старающиеся все сделать «правильно». На этапе создания прототипа или исследования они могут создавать ужасный код, но потом всегда возвращаются, чтобы переписать и исправить его, чтобы он стал «правильным». Поэтому разработчик, которому поставлена описанная задача, скорее всего потратит значительное время на то, чтобы узнать, как «правильно» выполнить задачу. Это скорее всего будет подразумевать манипуляции с XML использованием черной магии .NET Framework для XML.

Но это не мой метод. У меня просто нет на это времени. Что мне нужно, так это быстро решить задачу, во что бы то ни стало. Я предлагаю перестать относиться к файлу как к коду XML. В конце концов нам не нужны все эти данные в файле, так зачем же заставлять Windows PowerShell разбирать формат XML? Нам нужно всего лишь немного изменить текст:

$text = Get-Content myfile.xml $text = $text –replace '<!--','' $text = $text –replace '-->','' $text | Out-File newfile.xml

Читатель хотел убрать из XML все комментарии — именно это мое решение и делает. Оно просто находит все теги комментариев и заменяет их на пустую строку. Это успешно удаляет комментарии и делает заключенные в них XML-теги «активными» для любых операций чтения и использования этого XML-файла.

Так что в моем решении игнорируется, что этот текстовый файл содержит XML-код. Мне не пришлось делать ничего «относящегося к XML». Нужно было просто удалить пару-тройку символов. За счет отношения к файлу как простому тексту (заметьте, что я не приводил его к [xml] при получении содержимого) я смог эффективно решить задачу операторам работы с текстом в Windows PowerShell.

Подобное мое отношение выводит некоторых людей из себя. Некоторые спрашивают: «Как изменить разрешения файлов и папок в Windows PowerShell»? Я пожимаю плечами и отвечаю: «XCacls». Эта утилита работает в Windows PowerShell, я знаю, как ее использовать, и она решает задачу.

Альтернативные решения — Get-ACL и Set-ACLс — слишком запутанны. Они требуют более глубоких знания многих вещей в .NET Framework, чего на данном этапе мне совершенно не хочется делать. Зачем искать что-то еще, если есть инструмент, прекрасно справляющийся с задачей?

Совершенно очевидно, что мой подход полностью разделяют члены команды Windows PowerShell. Если бы это было не так, то зачем они так упорно работали над тем, чтобы внешние утилиты, такие как XCacls, Ipconfig, Ping и им подобные, прекрасно работали в Windows PowerShell? Они знали, что мы уже знаем, как пользоваться этими средствами, и возможность их использования в Windows PowerShell дает огромную фору, позволяя сходу решать массу задач.

Никто не изучает Windows PowerShell «просто так» — с помощью этой оболочки выполняется работа. Но это возможно, только если она позволяет пользоваться уже знакомыми утилитами. Это ваше право не соглашаться с моим подходом «Нашел проблему, устранил ее — и с чистой совестью иди домой». Многие с вами согласятся. Я считаю очень практичным просто выполнение работы, красота или уродство решения не имеет значения, если задача выполнена.

Don Jones

Дон Джонс (Don Jones) — носит звание MVP и является автором «Learn Windows PowerShell in a Month of Lunches» (Manning Publications Co., 2011),  книги, призванной помочь каждому администратору освоить Windows PowerShell. Дон читает общедоступные и интерактивные курсы по Windows PowerShell. Связаться с ним можно связаться через его веб-сайт ConcentratedTech.com.