2

Windows 2003 で IIS 6 のすべてのサイトと仮想ディレクトリを一覧表示する DOS コマンドを探しています。Powershell / WMIVBSC#などを使用してこれを行う方法があることは知っています。 Web サーバー上に新しいファイルを作成する必要なく、DOS から簡単に実行できます。

編集:この質問を調査しているときに、それを行うワンライナーを思いつくことができましたが、上記の基準に合ったよりエレガントなソリューションがある場合は、代替案を提案してください。

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が各行に対して 1 回実行され、%A変数は角かっこの間にあるものに設定されます。(これがバッチ ファイルの場合は、%%A代わりに使用します)。

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

    この 2 番目の 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
    

    したがって、コマンド ラインの残りの部分は呼び出されません。

  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 は物理パスを取得し、解析された 3 つの情報すべてをコンソールに出力します。

于 2012-11-04T11:14:48.850 に答える