Как установить разные переменные для каждого результата поиска в файле? - PullRequest
1 голос
/ 20 апреля 2019

Это дополнение к моему предыдущему вопросу:

Как искать строку с помощью Effective ("flyer", 100%);в файле и получить номер, присвоенный переменной?

Код, который у меня пока есть:

@echo off
set "Effective="
for /F "tokens=2 delims=%%) " %%I in ('%SystemRoot%\System32\find.exe /I "flyer" file.cfg') do set "Effective=%%I"
if defined Effective echo The effective value is: %Effective%

Этот код принимает число 100 из строки Effective("flyer", 100%);в file.cfg.

Но что делать, если есть две строки с flyer в file.cfg?

Я уже пробовал это, и этот код принимает значение последнего флаера 50.

Effective("flyer", 100%);

Effective("flyer", 50%);

Как выбрать между ними?

Первый блок кода, содержащий первый флаер:

CreateWeaponType("jda.weapon.aatower")
{
  Style("Projectile");

  MaxRange(96);

  HorizAngle(90);
  HorizSeparation(180);
  VertAngle(0);
  VertSeparation(120);
  TurnRate(90);
  Speed(100);
  Fixed(1);


  Damage()
  {
    Amount(10);

    Effective("infantry", 0%);
    Effective("vehicle", 0%);
    Effective("structure", 0%);
    Effective("flyer", 100%);

    Effective("mine", 0%);
  }

  Projectile("jda.proj.aatower");
  Delay(1);
  FirePoints()
  {
    Add("HP-Fire1");
    Add("HP-Fire2");
    Add("HP-Fire3");
    Add("HP-Fire4");
  }
}

Второй флаер находится в:

CreateObjectType("jda.exp.aatower", "Explosion")
{
  MapObj()
  {
    Mesh();
    GenericFX()
    {
      Add("ExplosionObj::Explode", "jda.fx.aatower.exp");
    }
  }
  ExplosionObj()
  {
    Damage()
    {
      Amount(16);

      Effective("infantry", 0%);
      Effective("vehicle", 0%);
      Effective("structure", 0%);
      Effective("flyer", 50%);
      Effective("mine", 0%);
    }
    AreaInner(4);
    AreaOuter(4);
    Persist(0);
  }
}

Как установить разные переменные для каждого?

Ответы [ 3 ]

2 голосов
/ 20 апреля 2019

Вот пример:

@For /F "Tokens=1*" %%A In ('FindStr /I "Effective(\"flyer\"," "file.cfg"^|Find /V /N ""')Do @For /F "Tokens=2Delims=,%% " %%C In ("%%B")Do @Set "flyer%%A=%%C"
@Set flyer[
@Pause

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

Вы также можете разбить длинную строку сверхув три строки, чтобы помочь поддерживать разумную длину строки для удобочитаемости:

@For /F "Tokens=1*" %%A In ('FindStr /I "Effective(\"flyer\"," "file.cfg"^
 ^|Find /V /N ""')Do @For /F "Tokens=2Delims=,%% " %%C In ("%%B"
)Do @Set "flyer%%A=%%C")
@Set flyer[
@Pause

Обратите внимание, что этот ответ не позволяет определить, какой процент принадлежит конкретному разделу файла .cfg:

2 голосов
/ 20 апреля 2019
@echo off
setlocal enabledelayedexpansion
set /a count=0
for /F "tokens=2 delims=%%) " %%I in ('%SystemRoot%\System32\find.exe /I "flyer"^<file.cfg') do set /a count+=1&set "Effective[!count!]=%%I"
echo %count% items found
if %count% gtr 0 set effective[

Критическая строка здесь - это строка setlocal enabledelayedexpansion, которая вызывает delayed expansion, где синтаксис !var! приводит к значению var, поскольку оно может измениться в цикле for.

Следовательно, поскольку count начинается с 0, если будет обнаружена соответствующая строка, то count увеличивается, а затем эффективное [ значение счетчика ] устанавливается на соответствующее значение.

После завершения цикла for отображается счетчик (очевидно, эта строка необязательна).

В последнем set просто отобразятся значения, которые set в среде для значений, начинающихся effective[ - но только если count больше 0.

(непроверенные)

1 голос
/ 20 апреля 2019

Ответы, отправленные Magoo и Compo , уже являются замечательными решениями. Так что мне больше нечего добавить, кроме случаев, когда вас интересует только первое значение flyer. В этом случае небольшая модификация исходного кода может быть использована для выхода из цикла с помощью перехода к метке под циклом после назначения первого flyer числа из file.cfg переменной среды Effective.

@echo off
set "Effective="
for /F "skip=2 tokens=2 delims=%%) " %%I in ('%SystemRoot%\System32\find.exe /I "flyer" file.cfg') do set "Effective=%%I" & goto HaveValue
:HaveValue
if defined Effective echo The effective value is: %Effective%

find.exe выводит пустую строку и строку ---------- FILE.CFG, которая является причиной использования FOR option skip=2 для пропуска первых двух строк, чтобы избежать присвоения FILE.CFG переменной окружения Effective.

Конечно, также возможно переписать весь код, если его интересует только первое flyer значение.

@echo off
for /F "tokens=2 delims=%%) " %%I in ('%SystemRoot%\System32\findstr.exe /R /I "effective.*flyer" file.cfg') do set "Effective=%%I" & goto HaveValue
echo No line with "flyer" found in "file.cfg"
goto :EOF

:HaveValue
echo The effective value is: %Effective%

Этот код использует findstr.exe вместо find.exe, который не выводит строки заголовка. И очень простая строка поиска регулярного выражения теперь используется вместо буквальной строки поиска flyer.

Но предоставленные пакетные файлы Magoo и Compo уже хороши тем, что действительно заинтересованы в обоих flyer числах.

...