26

ウィンドウズ

投稿 ( dos batch iterate through a delimited string ) に基づいて、以下のスクリプトを作成しましたが、期待どおりに動作しませんでした。

目標: 文字列 "Sun,Granite,Twilight" が与えられた場合、ループ内の各テーマ値を取得して、値を処理できるようにします。

現在の出力が正しくありません:

list = "Sun,Granite,Twilight"
file name is "Sun Granite Twilight"

最初の反復では、次のようになります。

list = "Sun,Granite,Twilight"
file name is "Sun"

次に、2回目の繰り返しは「ファイル名は「Granite」などです。何が間違っていますか?

コード:

set themes=Sun,Granite,Twilight

call :parse "%themes%"
goto :end

:parse
setlocal
set list=%1
echo list = %list%
for /F "delims=," %%f in ("%list%") do (
    rem if the item exist
    if not "%%f" == "" call :getLineNumber %%f
    rem if next item exist
    if not "%%g" == "" call :parse "%%g"
)
endlocal

:getLineNumber
setlocal
echo file name is %1
set filename=%1
endlocal

:end
4

4 に答える 4

50

これは私がそれを行う方法です:

@echo off
set themes=Sun,Granite,Twilight
echo list = "%themes%"
for %%a in ("%themes:,=" "%") do (
   echo file name is %%a
)

つまり、通常の (NO /F オプション)コマンドで、引用符で囲まれた各部分を変更Sun,Granite,Twilightしてから処理します。この方法は、に基づく反復ループよりもはるかに単純です。"Sun" "Granite" "Twilight"forfor /F"delims=,"

于 2013-06-18T01:50:27.710 に答える
11

私はあなたのコードにいくつかの変更を加えました。

  1. サブルーチンに陥らないように、サブルーチンの最後とメインルーチンの最後に goto :eof が必要です。
  2. tokens=1* (%%f は最初のトークン、%%g は残りの行)
  3. ~ in set list=%~1 引用符を削除して、引用符が蓄積されないようにする

    @echo off
    set themes=Sun,Granite,Twilight
    
    call :parse "%themes%"
    pause
    goto :eof
    
    :parse
    setlocal
    set list=%~1
    echo list = %list%
    for /F "tokens=1* delims=," %%f in ("%list%") do (
        rem if the item exist
        if not "%%f" == "" call :getLineNumber %%f
        rem if next item exist
        if not "%%g" == "" call :parse "%%g"
    )
    endlocal
    goto :eof
    
    :getLineNumber
    setlocal
    echo file name is %1
    set filename=%1
    goto :eof
    
于 2013-06-18T00:14:16.920 に答える
0

「tokens」キーワードが必要だったようです...

@echo off
set themes=Sun,Granite,Twilight

call :parse "%themes%"
goto :end

:parse
setlocal
set list=%1

for /F "delims=, tokens=1*" %%f in (%list%) do (
    rem if the item exist
    if not "%%f" == "" call :getLineNumber %%f
    rem if next item exist
    if not "%%g" == "" call :parse "%%g"
)
endlocal
goto :end

:getLineNumber
setlocal
echo file name is %1
set filename=%1
endlocal 

:end
于 2013-06-18T00:30:28.567 に答える