Пакетный скрипт "для / ф ..." - PullRequest
3 голосов
/ 17 июня 2011
for /F "skip=n tokens=3 delims= " %%i in (myfile.txt) do echo %%i

Возможно ли для skip=n ... быть переменной типа skip=%test% ..., где %test% имеет целочисленное значение?

Итак, я пытаюсь добавить столбец данных, и расположение этой таблицы в файле задается строкой.

Например:

$startTable 

0 1 4

1 2 4

2 1 4 

$endTable 

Таким образом, местоположение этой таблицы определяется номером строки, связанной с $ startTable. Я храню значение этого параметра в переменной (! Test!), Поэтому мне нужен тест skip =! и затем я начинаю добавлять третий столбец, пока не нажму $ endTable.

Когда я пытаюсь;

for /f "skip=!test! tokens=3 delims= " %%j in (!INPUTFILE!) do (
echo %%j
if %%j == "$endTable" goto :break
set /a test2+=%%j
)
:break

Я получаю следующую ошибку;

!test! tokens=3 delims= " was unexpected at this time.

-GK

Ответы [ 3 ]

3 голосов
/ 18 июня 2011

for не любит принимать синтаксис отложенного расширения внутри параметров.Это должно быть хорошо, так как вам это не нужно.Вместо этого используйте стандартную переменную% wrapped - это то, что используют примеры Майкла и Джебего.

Если вы действительно хотите использовать версию с отложенным расширением, вам понадобится временная переменная, чтобы сделать это:

set for_parameters="skip=!test! tokens=3 delims= "
for /f %for_parameters% %%j in (!INPUTFILE!) do ( echo %%j

РЕДАКТИРОВАТЬ: Вот то, что я бегу, пытаясь остаться близко к вашим исходным именам параметров.Я изменил ввод, чтобы показать, что% j обновляется и какие строки анализируются.

stackoverflow_input.txt

$startTable

0 1 3

1 2 4

2 1 5

$endTable

stackoverflow1.bat

@setlocal enabledelayedexpansion
@echo off
set INPUTFILE=stackoverflow_input.txt
set test=3
set test2=0
set for_parameters="skip=!test! tokens=3 delims= "
for /f %for_parameters% %%j in (!INPUTFILE!) do (
echo %%j
if %%j == "#endTable" goto :break
set /a test2+=%%j
)
:break
echo Sum: %test2%
endlocal

stackoverflow2.bat

@setlocal enabledelayedexpansion
@echo off
set INPUTFILE=stackoverflow_input.txt
set test=3
set test2=0
for /f "skip=%test% tokens=3 delims= " %%j in (!INPUTFILE!) do (
echo %%j
if %%j == "#endTable" goto :break
set /a test2+=%%j
)
:break
echo Sum: %test2%
endlocal

Результаты (проверено на Win 7, Server 2008R2, Server 2003 и Win XP SP3):

D:\temp>stackoverflow1.bat
4
5
Sum: 9

D:\temp>stackoverflow2.bat
4
5
Sum: 9

Если расширения команд отключены, вместо этого вы получите:/f was unexpected at this time.

1 голос
/ 17 июня 2011

Да. Это отобразит 4-ю и последующие строки test.txt

set sk=3  
for /f "skip=%sk% delims=" %%L in (test.txt) do (  
    echo %%L  
    )  
1 голос
/ 17 июня 2011

Да.

set num=2
for /F "skip=%num% tokens=3 delims= " %%i in (myfile.txt) do echo %%i

Это пропустит первые две строки.Вы могли бы просто попытаться добавить переменную!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...