То, как я добираюсь, чтобы цикл работал с запятой, разграничило строку?

Это - мой код до сих пор:

for /f "tokens=1 eol=," %%f IN ("1,2,3,4") do  (
    echo .
    echo %%f    
)

Я ожидаю что произвести:

.
1
.
2
.

и т.д...

Но вместо этого я добираюсь:

.
1

И вот именно. Что я пропускаю?

6
задан Ross Ridge 5 April 2016 в 19:31
поделиться

3 ответа

Вы неправильно поняли варианты.

  • Токены = 1 означает, что вы хотите только первый токен на каждой строке. Вы хотите все жетоны на линии.
  • EOL =, означает, что вы хотите интерпретировать запятую как начало конца комментариев линии . Вы хотите использовать DELIMS =, вместо этого, чтобы указать, что запятая - это разделитель (вместо значения по умолчанию Whitespace).

Для / F в основном для работы на строках в файле. Вы этого не делаете. Вы работаете в одной строке, поэтому ответ Rubens ближе к тому, что вы хотите:

@ECHO OFF
SET test=1,2,3,4
FOR /D %%F IN (%test%) DO (
  ECHO .
  ECHO %%F
)

Однако, теоретически, вы должны быть в состоянии сказать что-то вроде:

FOR /F "usebackq delims=, tokens=1-4" %%f IN ('1^,2^,3^,4') DO (
  ECHO .
  ECHO %%f    
  ECHO .
  ECHO %%g
  ECHO .
  ECHO %%h
  ECHO .
  ECHO %%i
)

это работает, но, вероятно, не масштаб в том, как вы хотите. Обратите внимание, что вы должны избежать запятой в строке, используя символ ^, и вы должны указать нужные токены, а затем использовать последующие переменные% G,% H и% I, чтобы получить их.

11
ответ дан 9 December 2019 в 20:43
поделиться

Попробуйте:

set test=1,2,3,4
for /d %%f IN (%test%) do echo %%f
1
ответ дан 9 December 2019 в 20:43
поделиться

@op, и хотя вы изучаете, как использовать пакетные сценарии DOS, вы можете Хотите изучать VBScript (или PowerShell). Это альтернативы, и они облегчают ваши пакетные сценарии, особенно когда речь идет о более сложных задачах.

Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strInput = objArgs(0)
s = Split(strInput,",")
For Each i In s
 WScript.Echo i
Next

Сохранить вышеупомянутую как mysplit.vbs и в командной строке

C:\test>cscript //nologo mysplit.vbs 1,2,3,4
1
2
3
4
0
ответ дан 9 December 2019 в 20:43
поделиться