%x был неожидан в это время. сценарий пакетной обработки

@echo off
for /f "tokens=1,2 delims=," %%x in (my.csv) do (
if %M% LSS %%x set M=%%x
)
echo Max X Value= %M%

Иногда это хорошо работает, иногда это перестало работать со следующей ошибкой:

%x was unexpected at this time.
11
задан Eric Leschinski 29 March 2013 в 14:42
поделиться

3 ответа

Проблема в том, что вы используете % m% внутри для цикла . Это оценивается, когда цикл читается (перед любыми итерациями вообще). Другими словами, вся петля, до того, как и закрывающая скобка, читается и оценивается перед выполнением. Итак % m% всегда будет начальное значение, независимо от того, что вы на самом деле настроете его в рампе.

Примером следует, надеюсь, проиллюстрировать это:

set val=7
for %%i in (1) do (
    set val=99
    echo %val%
)
echo %val%

, который приводит к неожиданному (к некоторым):

7
99

просто потому, что % Val% в первом оттенке Echo интерпретируется (т. Е. Для петли интерпретируется) до того, как любой из него работает.

Вам нужно отложить расширение вместе с чем-то, что заставит значение m , чтобы быть установленным в первом %% x независимо от. Используя команду SetLocal и ! M! Вместо % m% задержит оценку м до каждую раз, когда линия выполнена.

Кроме того, настройка M изначально ни в чем и не заставляет его быть %% x , когда он Ничто не обеспечит первое значение %% x загружается в м .

@echo off
setlocal enableextensions enabledelayedexpansion
set m=
for /f "tokens=1,2 delims=," %%x in (my.csv) do (
    if "!m!" == "" set m=%%x
    if !m! lss %%x set m=%%x
)
echo Max X Value = !m!
endlocal

Используя вышеуказанный код с помощью этого файл my.csv :

1,a
2,b
10,c
3,d

приводит к выводу:

Max X Value = 10

, как и ожидалось, или для ваших пример данных в другом комментарии:

422,34
464,55
455,65
421,88

Вы получаете:

Max X Value = 464
19
ответ дан 3 December 2019 в 05:34
поделиться

Там нет переменных среды с именем M , поэтому, когда эта строка интерпретируется:

if %M% LSS %%x set M=%%x

После 1-го раунда замены, он смотрит на переводчик чего-то вроде

if LSS %x set M=%x

, чтобы избежать проблем, которые Paxdiablo упоминаются о % m% , расширяются только тогда, когда петли Сначала вы можете использовать функцию отсроченного расширения, которую он обсуждает, или перемещает тестирование и настройку m в подпрограмму, который вызывается из петли, но существует за пределами петли, так что TS интерпретируемый (и расширен) на каждом вызове:

@echo off
set M=
for /f "tokens=1,2 delims=," %%x in (my.csv) do (
    call :setmax %%x
)
echo Max X Value= %M%
goto :eof

:setmax
if "%M%" == "" set M=%1
if %M% LSS %1 set M=%1
goto :eof
2
ответ дан 3 December 2019 в 05:34
поделиться

Проблема в вашем , если% m% . Где% m%? Объявите его в первую очередь, например,

@echo off
set M=""
for /f "tokens=1,2 delims=," %%x in (file) do (
if %M% LSS %%x set M=%%x
)
echo Max X Value= %M%

Альтернатива, вы можете использовать VBScript

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
Set objFile = objFS.OpenTextFile(strFile)
t=0
Do Until objFile.AtEndOfStream
    linenum = objFile.Line
    strLine = objFile.ReadLine  
    s = Split(strLine,",")
    For Each num In s       
        WScript.Echo "num "&num
        If Int(num) >= t Then
            t=Int(num)
        End If  
    Next
    WScript.Echo "Max for line:" & linenum & " is " & t
Loop

пример вывода

C:\test>type file
422,34464,55455,65421,88

C:\test>cscript //nologo test.vbs file
Max for line:1 is 65421

Обновление

C:\test>type file
422,34464,55455,65421,88

C:\test>cscript //nologo test.vbs file
Max for line:1 is 65421

: Найти максимальное значение Column Wise

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
Set objFile = objFS.OpenTextFile(strFile)
t=0
Do Until objFile.AtEndOfStream
    linenum = objFile.Line
    strLine = objFile.ReadLine  
    s = Split(strLine,",")
    If Int(s(0)) >= t then      
            t=Int(s(0))
    End If      
Loop
WScript.Echo "Max is " & t & " (line: " & linenum & ")"

Вывод

C:\test>type file
422,34
464,55
455,65
421,88

C:\test>cscript //nologo test.vbs file
Max is 464 (line: 2)
0
ответ дан 3 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: