0

今日、別の質問に答えて次のスクリプトを書きましたが、アレイで発生している問題を解決できません。何らかの理由で、配列内で使用している変数が正しく評価されません。これが私のコードです:

@echo off
setlocal enabledelayedexpansion

set q=wmic /NAMESPACE:\\root\directory\ldap PATH ds_computer get ds_name
set q1=NICCONFIG get DNSHostname^,IPAddress^,MACAddress
set /a "c=1" & set /a "inc=1" & set /a "inc2=0"
::for /f "skip=1" %%a in ('%q%') do (
    for /f "tokens=1-3 delims=] " %%j in (
      'wmic logicaldisk where drivetype^=3 get deviceid^,volumeserialnumber^|find /N ":"') do (
            set "lines=%%j"
            set "v[!c!]=%%k" & set /a "c+=1"
            set "v[!c!]=%%l" & set /a "c+=1"
            if [!lines! equ [!c! goto :out
     )
    :out
    set c=
    for /f "tokens=1 delims=|" %%i in (
       'wmic /node:"wpcf-dc" OS get name^|find "|"') do (set v=%%i)
    for /f "tokens=1-3 delims={}" %%b in (
       'wmic /NODE:"wpcf-dc" NICCONFIG Where IPEnabled^=TRUE get DNSHostname^,IPAddress^,MACAddress /FORMAT:TABLE^|find "{"'
      ) do ( For /F "tokens=1-3 delims= " %%e in ("%%~b %%~c %%d") do (
       echo(Host: %%e
       echo(IP: %%f
           echo(MAC: %%g
       echo(Windows Version: !v!
       set lines=!lines:[= !
       for /L %%l in (1,2,!lines!) do (
           set /a "inc2=%%l" & set /a "inc2+=1"
           echo value of inc2=!inc2!
           echo(Drive!inc!: !v[%%l]!
           echo(Volume!inc!: !v[!inc2!]!
           set /a "inc+=1"
       )     
      ) 
    )
 ::)

これが私が得ている出力です。

C:\Scripts\Batch>LDAPquery.cmd
Host: WPCF-DC
IP: 10.6.1.226
MAC: 00:11:43:EC:D4:B7
Windows Version: Microsoft Windows Server 2003 Standard Edition
value of inc2=2
Drive1: C:
Volume1: inc2
value of inc2=4
Drive2: D:
Volume2: inc2

inc2 の値が数値の場合、配列内で評価されない理由がわかりません。任意の洞察をいただければ幸いです。

4

2 に答える 2

2

これはあなたのコードの私のバージョンです:

@echo off
setlocal enabledelayedexpansion

set q=wmic /NAMESPACE:\\root\directory\ldap PATH ds_computer get ds_name
set q1=NICCONFIG get DNSHostname,IPAddress,MACAddress
set /a c=1, inc=1, inc2=0
::for /f "skip=1" %%a in ('%q%') do (
    for /f "tokens=1-3 delims=] " %%j in (
      'wmic logicaldisk where drivetype=3 get deviceid,volumeserialnumber^|find /N ":"') do (
        set "lines=%%j"
        set "v[!c!]=%%k" & set /a "c+=1"
        set "v[!c!]=%%l" & set /a "c+=1"
        if "!lines!" equ "!c!" goto :out
    )
    :out
    set c=
    for /f "tokens=1 delims=|" %%i in (
      'wmic /node:"wpcf-dc" OS get name^|find "|"') do "set v=%%i"
    for /f "tokens=1-3 delims={}" %%b in (
      'wmic /NODE:"wpcf-dc" NICCONFIG Where IPEnabled=TRUE get DNSHostname,IPAddress,MACAddress /FORMAT:TABLE^|find "{"') do (
        for /F "tokens=1-3" %%e in ("%%~b %%~c %%d") do (
            echo Host: %%e
            echo IP: %%f
            echo MAC: %%g
            echo Windows Version: !v!
            set lines=!lines:[= !
            for /L %%l in (1,2,!lines!) do (
                set /a inc2=%%l+1
                echo value of inc2=!inc2!
                echo Drive!inc!: !v[%%l]!
                for %%v in (!inc2!) do echo Volume!inc!: !v[%%v]!
                set /a "inc+=1"
            )     
        ) 
    )
::)

この行は存在してはいけないと思います:

set c=

入れ子になった IF/FOR コマンドの正当化列を厳密にすることをお勧めします。この方法は、閉じていない括弧を見つけるのに役立ちます。また、括弧が不要な場合は使用しないでください。

echo Volume!inc!: !v[!inc2!]!感嘆符の解析は左から右に行われるため、このコマンドはこの方法では実行できないことに注意してください。したがって、前の行は次のことを意味します: echo "Volume"+value of "inc"+": "+value of "v["+ 「inc2」+「]」の値。!inc2!FOR コマンドで を展開してから、2 番目の展開で置換可能なパラメーターを使用する必要があります。

for %%v in (!inc2!) do echo Volume!inc!: !v[%%v]!

前のポイントの詳細な説明については、この投稿を参照してください。

最上位の をアクティブ化すると、GOTO が実行されたときにコマンドによって中断されることに注意する必要がありfor /f "skip=1" %%a in ('%q%') do (ますgoto :outfor /f "tokens=1-3 delims=] " %%j in ( 'wmic ...ネストされたコマンドだけを壊す方法は、次のように変更することです。

for /f "tokens=1-3 delims=] " %%j in ('wmic ... ') do if "!lines!" neq "!c!" (

if ... goto :outと の両方の:outラベルを削除します。

于 2013-05-11T18:14:46.313 に答える
1

これを試して:

@echo off
set "v[2]=MyVolume"
set inc2=2
setlocal enabledelayedexpansion
set /a inc=1
for /L %%l in (1,2,2) do (
   set /a inc2=%%l+1
   echo value of inc2=!inc2!
   echo(Volume!inc!: !v[!inc2!]!
   set /a "inc+=1"
)     
set /a inc=1
for /L %%l in (1,2,2) do (
   set /a "inc2=%%l+1
   echo value of inc2=!inc2!
   call echo(Volume!inc!: %%v[!inc2!]%%
   set /a "inc+=1"
)     

出力は次のとおりです。

value of inc2=2
Volume1: inc2
value of inc2=2
Volume1: MyVolume
于 2013-05-10T19:07:53.357 に答える