0

パッチのリストを JSON 形式で出力しようとしています。

"patches" : {
"1" : "KB123456",
"2" : "KB123456", ...

しかし、これは私が得ているものです:

"patches" : {
"1" : "",
"2" : "patch[2]",
"3" : "patch[3]", ...

これは私のコードです

@echo off 
set count1=1    
setlocal enabledelayedexpansion

set patches="wmic qfe get HotfixID"
for /f "skip=1" %%i in (' %patches% ') do for /f "delims=" %%j in ("%%i") do (
    set patch[%count1%]=%%j
    set /a count1=count1+1
)

if %count1%==1 (
    echo "patch" : "%patch[1]%",
) else  (
    echo "patches" : {
    set index=0

    :loop
    set /a index=index+1
    for /f "tokens=1" %%G in (" %patch[1]% ") do set p1=%%G ::<---*
    echo %p1%
    rem set p=%patch[!index!]%
    rem echo "!index!" : "%p%",
    if NOT "%index%" == "%count1%" goto :loop

    set p=%patch[%count1%]%
    echo "%count1%" : "%p%"
    echo }
)
endlocal

最初のforループでは、コマンド出力から受け取った各パッチに配列パッチを設定しています。その後、配列内の各要素を読み取って順番に出力しようとしています。

* ここでは、最初の要素を正しく出力します。しかし、それを置き換えると

 for /f "tokens=1" %%G in (" %patch[!index!]% ") do set p1=%%G

それは私に空の変数を与えます。

別の変数内で変数を渡すにはどうすればよいですか?

4

2 に答える 2

0

そのため、バッチではforループが他の言語と同じように動作しないことがわかりました。反復ではなく、すべてを同時に行うようです。for変数をインクリメントし、ループ内で何かを実行したい場合は、変数を追加setlocal enabledelayedexpansionして の間に配置する必要があります!。ただし、ループの外に出たら、%_%を使用してアクセスできますcount_patch

@echo off 
set count_patch=0
set idx=0
setlocal enabledelayedexpansion

set patches="wmic qfe get HotfixID"
for /f "skip=1" %%i in (' %patches% ') do for /f "delims=" %%j in ("%%i") do (
      set /a count_patch=count_patch+1
      set patch[!count_patch!]=%%j  
)

if %count_patch%==1 (
     echo "patch" : "%patch1%",
) else  (
echo "patches" : {

 for /f "skip=1" %%i in (' %patches% ') do for /f "delims=" %%j in ("%%i") do (
    set /a idx = idx+1
    if !idx!==%count_patch% ( echo "!idx!" : "%%j" ) else ( echo "!idx!" : "%%j",) 
)
echo }
)
endlocal

そこで私がしたことは、パッチの数を数えてから、インデックス (idx) がパッチ数と同じ値になるまでそれらを繰り返し、その結果をコンマなしで出力することでした。

于 2016-06-09T20:56:26.270 に答える
0

Xidelの場合、これはかなり単純です。

wmic qfe get HotfixID | xidel.exe -s - -e "{'patches':{|tokenize(normalize-space($raw),' ') ! {position():.}|}}"

コマンドを Xidel の入力にパイプします。JSON オブジェクトの「パッチ」を作成します。そこから、最初に末尾の空白を正規化し、次にすべてのエントリのシーケンスを作成することにより、入力を処理します。次に、オブジェクトにシーケンス インデックスとその値を入力します。

出力:

{
  "patches": {
    "1": "KB123456",
    "2": "KB123456",
    "3": "KB123456",
    [...]
    "100": "KB123456",
  }
}
于 2019-01-09T00:25:00.410 に答える