Команда DOS для вывода списка всех виртуальных каталогов в IIS 6
Я ищу команду DOS для вывода списка всех сайтов и виртуальных каталогов в IIS 6 под Windows 2003. Я знаю, что есть способы сделать это с помощью Powershell / WMI, VBS, C# и т. Д. Но все, что мне нужно, это быстро и грязно, без суеты способ сделать это из DOS, без необходимости создавать какие-либо новые файлы на веб-сервере.
РЕДАКТИРОВАТЬ: При исследовании этого вопроса мне удалось придумать однострочную, которая делает это, но, пожалуйста, предложите альтернативу, если у вас есть более элегантное решение, которое соответствует критериям выше.
1 ответ
Вот что я придумал:
@FOR /F "delims=[]" %A IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs ENUM /P /w3svc') DO @FOR /F delims^=^"^ tokens^=2 %B IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs GET %A/ServerComment') DO @FOR /F delims^=^"^ tokens^=2 %C IN ('@cscript %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/Root/Path') DO @ECHO %A %B "%C"
Команда выводит список идентификаторов виртуальных каталогов, а также "понятное имя" и путь для каждого, например:
/w3svc/1 Default Web Site "c:\inetpub\wwwroot"
/w3svc/1236224994 FunWidgets "C:\Inetpub\wwwroot\FunWidgets"
/w3svc/1359392326 JimSmith.com "C:\Inetpub\wwwroot\JimSmith"
/w3svc/1835917338 BouncyToys "C:\Inetpub\wwwroot\bouncytoys"
/w3svc/198968327 AvalonWest "C:\Inetpub\wwwroot\AvWest"
Если вы хотите передать вывод в текстовый файл, сначала убедитесь, что он не существует, а затем добавьте >> filename.txt
на команду выше. (например: DEL sites.txt & ... >> sites.txt
)
Вот разбивка того, как работает по общему признанию запутанная команда:
@
перед каждым оператором ставится префикс, чтобы избежать повторения самого оператора, который может загрязнить вывод.@FOR /F "delims=[]" %A IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs ENUM /P /w3svc') DO
Запускает AdsUtil.vbs, который устанавливается вместе с IIS6 (и читает метабазу от нашего имени).
-
ENUM /P /w3svc
Параметр говорит, что он должен выдавать список всех сайтов и идентификаторов виртуальных каталогов, начиная с корневого узла. - Переключатель nologo подавляет обычную преамбулу об авторском праве CScript, чтобы отобразить только интересующий нас вывод. Двойная обратная косая черта используется для экранирования символа косой черты, поскольку мы находимся внутри строки.
Вывод части в одинарных кавычках напоминает следующее:
[/w3svc/1] [/w3svc/1236224994] [/w3svc/1359392326] [/w3svc/1835917338] [/w3svc/198968327] [/w3svc/AppPools] [/w3svc/Filters] [/w3svc/Info]
Это передается в
FOR /F
, который проходит по каждой строке.delims=[]
говорит FOR обрабатывать квадратные скобки как разделители. Все послеDO
будет выполняться один раз для каждой строки, с%A
переменная, установленная в квадратные скобки. (Если бы это был командный файл, вы бы использовали%%A
вместо).-
@FOR /F delims^=^"^ tokens^=2 %B IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/ServerComment') DO
Этот второй блок FOR запускает AdsUtil с
GET
параметр для получения свойства ServerComment для данного сайта / виртуального каталога. Это понятное человеку имя в IIS. К сожалению, вывод немного сложнее разобрать. например, для/w3svc/1
вы вернетесь:ServerComment : (STRING) "Default Web Site"
Трюк разбирает текст между кавычками.
Обратите внимание, что узлы, которые нас не интересуют (AppPools, Filters и Info), не имеют свойства ServerComment и дают результат без кавычек, например:
The path requested could not be found. ErrNumber: -2147024893 (0x80070003) Error Trying To GET the Object (GetObject Failed): w3svc/Filters
Таким образом, оставшаяся часть командной строки не вызывается для них.
@FOR /F delims^=^"^ tokens^=2 %C IN ('@cscript %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/Root/Path') DO @ECHO %A %B "%C"
Этот последний FOR извлекает физический путь, затем выводит все три фрагмента проанализированной информации на консоль.