Батч, у меня небольшая проблема с поиском

Поэтому я написал пакетный скрипт, который поможет организовать небольшую лотерею, которую я запускаю в игре. Он запрашивает ввод имени игрока, а затем до 5 номеров лотереи от 1 до 100. Сценарий добавляет имя игрока и номера, которые они выбрали, в текстовый документ, а также добавляет числа в текстовый документ, чтобы он знал, какие номера уже «заняты», и предупреждал меня, если я попытаюсь ввести номер. дубликат (также сделана небольшая сортировка, чтобы «взятые» номера отображались «по порядку», чтобы их было легче увидеть).

когда я использовал «findstr /c:» для поиска в файле «взятых чисел», он предполагал, что 1, 10, 100 и т. д. — это одно и то же число, если я искал «1», потому что... эти числа имеют то, что я м ищу в них. Я решил эту проблему, введя однозначные числа как 01-09, но это все равно оставило меня с «10» и 100 (в глазах findstr) одинаковыми.

Поэтому я попытался использовать «findstr/x/c:», чтобы получить точное значение, и здесь я столкнулся со своей проблемой. Теперь, когда /x находится там, он просто игнорирует проверку того, является ли значение одинаковым, и я не могу понять, почему, пожалуйста, помогите: P это сводит меня с ума.

@echo off
echo --------------------
echo Lottery Program
echo --------------------
echo.
echo.
echo These are the Taken numbers.
type takennumbersnice.txt
echo.
echo.
set /p name= Please type the players name 
:thestart
echo ---------------------------
set /p multinum1= Please type their first number [01-100] 
findstr /x /c:%multinum1% takennumbersnice.txt && (
echo This number has already been taken! & pause && goto thestart
) || (
echo %multinum1%>> takennumbers.txt & goto next) 
:next
:thestart2
echo ---------------------------
set /p multinum2= Now type their second number [0 if they only picked 1 number] 
if '%multinum2%'=='0' (
goto endofnums
) else (
goto 3
)
:3
findstr /x /c:%multinum2% takennumbersnice.txt && (
echo This number has already been taken! & pause  && goto thestart2
) || (
echo %multinum2%>> takennumbers.txt &goto next2)
:next2
:thestart3
echo ---------------------------
set /p multinum3= Now type their third number [0 if they only picked 2 numbers] 
if '%multinum3%'=='0' (
goto endofnums
) else (
goto 4
)
:4
findstr /x /c:%multinum3% takennumbersnice.txt && (
echo This number has already been taken! & pause  && goto thestart3
) || (
echo %multinum3%>> takennumbers.txt &goto next3)
:next3
:thestart4
echo ---------------------------
set /p multinum4= Now type their fourth number [0 if they only picked 3 numbers] 
if '%multinum4%'=='0' (
goto endofnums
) else (
goto 5
)
:5
findstr /x /c:%multinum4% takennumbersnice.txt && (
echo This number has already been taken! & pause  && goto thestart4
) || (
echo %multinum4%>> takennumbers.txt &goto next4)
:next4
:thestart5
echo ---------------------------
set /p multinum5= Now type their fifth number [0 if they only picked 4 numbers] 
if '%multinum5%'=='0' (
goto endofnums
) else (
goto 6
)
:6
echo ---------------------------
findstr /x /c:%multinum5% takennumbersnice.txt && (
echo This number has already been taken! & pause  && goto thestart5
) || (
echo %multinum5%>> takennumbers.txt)
:endofnums
set number= %multinum1% %multinum2% %multinum3% %multinum4% %multinum5%
echo %name% has chosen the number[s] %number%
echo %name% %number% >> lottery.txt
sort < takennumbers.txt > takennumbersnice.txt
echo press any key to exit
pause > nul
exit

person Thorpy    schedule 10.11.2014    source источник


Ответы (1)


Прежде всего, findstr достаточно умен, чтобы определить разницу между 1, 10 и 100 без необходимости форматирования чисел меньше 10. Я бы рекомендовал отбрасывать начальный 0, поскольку именно так пакет указывает, что число находится в шестнадцатеричном формате, и вы получите ошибку для 08 и 09.

Итак, ваша проблема доставила мне немало хлопот, но я разобрался. Когда вы повторяете число в текстовом файле, вы непреднамеренно добавляете пробел в конец числа, и когда findstr ищет точную строку, она не находит ее, потому что вместо «15» у вас есть «15». (обратите внимание на пробел).

К счастью, решение простое. Изменять

echo %multinum1%>>takennumbers.txt & goto next)

to

echo %multinum1%>>takennumbers.txt&goto next)

И сделайте то же самое для трех других строк.

person SomethingDark    schedule 10.11.2014
comment
Привет, не могли бы вы вставить фиксированный код, пожалуйста: P Я внес изменения, которые вы сказали, но теперь, если второй человек выбирает однозначное число, оно по какой-то причине воспроизводится эхом, поскольку эхо отключено вместо числа. - person Thorpy; 10.11.2014
comment
Я не проверял никаких неожиданных поведений, кроме того, о котором вы упомянули изначально. Позвольте мне взглянуть на это ... - person SomethingDark; 10.11.2014
comment
Добавьте строку setlocal enabledelayedexpansion в начало файла под @echo off и замените echo %multinum1%>>takennumbers.txt&goto next на echo !multinum1!>>takennumbers.txt&goto next. - person SomethingDark; 10.11.2014
comment
Большое спасибо! Вы это исправили :) Я не понимаю, почему это исправило, но это так, лол. - person Thorpy; 11.11.2014
comment
Я сам не совсем уверен, но, основываясь на том, как он решает аналогичную проблему с циклами for, я полагаю, что это связано с тем, что пакет не всегда хорошо работает со скобками. - person SomethingDark; 11.11.2014
comment
теперь, чтобы сделать сортировку, не добавляйте однозначные цифры, такие как 9, к 90-99, лол (или я могу просто продолжать использовать 01-09, так как это пока не сломает, хе-хе) - person Thorpy; 11.11.2014