2

我正在寻找一个 DOS 命令来列出 Windows 2003 下 IIS 6 中的所有站点和虚拟目录。我知道有一些方法可以使用Powershell / WMIVBSC#等来做到这一点。但我想要的只是一个快速而肮脏的,从 DOS 轻松完成,无需在 Web 服务器上创建任何新文件。

编辑:在研究这个问题时,我设法想出了一个可以做到这一点的单线,但如果你有一个更优雅的解决方案符合上述标准,请建议一个替代方案。

4

1 回答 1

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:)

以下是公认的复杂命令如何工作的细分:

  1. @是每个语句的前缀,以避免回显语句本身,这会污染输出。

  2. @FOR /F "delims=[]" %A IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs ENUM /P /w3svc') DO

    调用与 IIS6 一起安装的AdsUtil.vbs(并代表我们读取元数据库)。

    • ENUM /P /w3svc参数告诉它从根节点开始输出所有站点和虚拟目录 ID 的列表。
    • 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)。

  3. @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技巧解析出引号之间的文本。

    请注意,我们不感兴趣的节点(AppPools、Filters 和 Info)没有 ServerComment 属性,并给出没有引号的结果,例如:

    The path requested could not be found.
    ErrNumber: -2147024893 (0x80070003)
    Error Trying To GET the Object (GetObject Failed): w3svc/Filters
    

    因此,不会为它们调用命令行的其余部分。

  4. @FOR /F delims^=^"^ tokens^=2 %C IN ('@cscript %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/Root/Path') DO @ECHO %A %B "%C"

    这个最终的 FOR 检索物理路径,然后将所有三个解析信息输出到控制台。

于 2012-11-04T11:14:48.850 回答