XML Output

Во многих утилитах Vista и Windows 2008 есть ключик позволяющий вывести результаты в формате XML. Это сделано в первую очередь для удобства автоматизации. А автоматизировать проще всего в PowerShell😉

Возьмем например команду appcmd.exe с помощью которой можно просматривать и изменять конфигурацию IIS7.0. Так как команда находится в подпапке system32\inetserv\ то проще сделать альяс для неё чем постоянно указывать полный путь:

Set-Alias appcmd $env:windir\System32\inetsrv\appcmd.exe'

Кстати рекомендую сразу поместить в профиль.

Теперь посмотрим список виртуальных каталогов на сервере:

[PS C:\root] appcmd list vdir
VDIR "Default Web Site/" (physicalPath:%SystemDrive%\inetpub\wwwroot)
VDIR "Default Web Site/TS/" (physicalPath:C:\Windows\web\ts\)
VDIR "Default Web Site/Rpc/" (physicalPath:C:\Windows\System32\RpcProxy)
VDIR "Default Web Site/RpcWithCert/" (physicalPath:C:\Windows\System32\RpcProxy)

Каждый виртуальный каталог в своей строчке… Конечно лучше чем в iis6… Но хотелось бы работать с этим выводом как с обычными объектами PowerShell, применять Where, использовать ConvertTo-Html, или просто отформатировать в виде таблицы… Можно конечно распарсить с помощью регекспов, но это писать новое выражение для каждого типа объектов… Да и ошибиться несложно. Лучше преобразовать вывод в формат XML. Ну и укажем соответствующий ключик:

appcmd list vdir /xml

Вот только красивее не стало… PowerShell естественно не ожидает от обычной консольной команды вывода нормальных xml объектов, поэтому просто показывает всё как есть — тоесть как текст… Ну чтож, скажем ему что это всё-таки XML:

[xml]$result = appcmd list vdir /xml

Теперь в переменной $result у нас содержится вывод команды в формате xml. И можно посмотреть xml объекты например так (кстати .appcmd.VDIR дополняется с помощью клавиши табуляции):

[PS C:\root] $result.appcmd.VDIR

physicalPath                  path APP.NAME                     VDIR.NAME
------------                  ---- --------                     ---------
%SystemDrive%\inetpub\wwwroot /    Default Web Site/            Default Web ...
C:\Windows\web\ts\            /    Default Web Site/TS          Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/Rpc         Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/RpcWithCert Default Web ...

Ну и уже можно работать как привычно🙂

[PS C:\root] $result.appcmd.VDIR | where {$_.physicalPath -like "*rpcproxy"} | F
ormat-Table *path -a

physicalPath                 path
------------                 ----
C:\Windows\System32\RpcProxy /
C:\Windows\System32\RpcProxy /

Или в одну строку:

([xml](appcmd list vdir /xml)).appcmd.vdir
physicalPath                  path APP.NAME                     VDIR.NAME
------------                  ---- --------                     ---------
%SystemDrive%\inetpub\wwwroot /    Default Web Site/            Default Web ...
C:\Windows\web\ts\            /    Default Web Site/TS          Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/Rpc         Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/RpcWithCert Default Web ...

Но самое главное: точно также, можно работать с любыми другими объектами вывода любой другой команды умеющей выводить результаты в XML!

Опубликовано в PowerShell, Windows 2008. Комментарии к записи XML Output отключены
%d такие блоггеры, как: