我正在寻找一个DOS命令来列出Windows 2003下IIS 6中的所有站点和虚拟目录。我知道有很多方法可以使用Powershell / WMI,VBS,{{3}来执行此操作但是,我想要的只是一个快速而肮脏,毫不费力的方法从DOS完成它,而无需在Web服务器上创建任何新文件。
编辑:在研究这个问题时,我设法提出了一个单行程,但如果你有一个符合上述标准的更优雅的解决方案,请提出建议。
答案 0 :(得分:4)
这是我想出的:
@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"
该命令输出虚拟目录ID的列表,以及"友好名称"和每个的路径,例如:
/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
调用与IIS6一起安装的AdsUtil.vbs(并代表我们读取metabase)。
ENUM /P /w3svc
参数告诉它从根节点开始吐出所有站点和虚拟目录ID的列表。单引号中部分的输出类似于以下内容:
[/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块使用GET
参数运行AdsUtil,以检索给定站点/虚拟目录的ServerComment属性。这是IIS中看到的人性化名称。不幸的是,输出解析起来有点棘手。例如对于/w3svc/1
,您会回来:
ServerComment : (STRING) "Default Web Site"
careting trick解析引号之间的文字。
请注意,我们不感兴趣的节点(AppPools,过滤器和信息)没有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检索物理路径,然后将所有三段解析信息输出到控制台。