Как запустить несколько команд в одной строке, если в переменной есть пробел - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть программа, над которой я работаю, для которой было бы очень полезно установить несколько переменных в одной строке для организации. У меня это работает достаточно хорошо в некоторых случаях, но если переменная в одной из команд является фразой или предложением, пробелы разбивают ее и программа падает при достижении этой строки.

Вот как мой код установить:

@echo off
set /a roll=(%random%%%100)+1
if %roll% geq 56 set size=Small Town & set shortsize=town

В тот момент, когда программа попадает на любую строку, как это, она падает. Он закончится sh, если я поставлю кавычки вокруг Малого города (или любой другой переменной), но затем он включит эти кавычки в окончательный вывод. Я не хочу этого, так как я пытаюсь сделать текст читаемым человеком, а фраза «маленький город» будет вставлена ​​во множество мест в готовый текстовый продукт.

Как я могу запустить строку, чтобы в кавычках не было видно готовый файл .txt? Если лучший способ - просто сохранить все в текстовый файл, то каким-то образом стереть все «символы» из этого текстового файла и , а затем открыть файл для пользователя, чтобы прочитать результаты, что тоже будет работать.

РЕДАКТИРОВАТЬ:

Это может помочь увидеть полную таблицу и логи c Я работаю с. Так вот оно.

:townsize
@echo off
set /a roll=(%random%%%100)+1
if %roll% leq 5 set size=Thorp & set shortsize=thorp
if %roll% geq 6 set size=Hamlet & set shortsize=hamlet
if %roll% geq 11 set size=Village & set shortsize=village
if %roll% geq 56 set size=Small_Town & set shortsize=town
if %roll% geq 66 set size=Medium_Town & set shortsize=town
if %roll% geq 76 set size=Large_Town & set shortsize=town
if %roll% geq 86 set size=Small_City & set shortsize=city
if %roll% geq 96 set size=Medium_City & set shortsize=city
if %roll% equ 99 set size=Large_City & set shortsize=city
if %roll% geq 100 set size=Metropolis & set shortsize=metropolis
if %size% equ Metropolis set /a population=(((%random%%%10)+1)*25000)+125000 & set sizemod=9
if %size% equ Large_City set /a population=(((%random%%%15)+2)*1000)+10000 & set sizemod=8 & set size=Large City"
if %size% equ Medium_City set /a population=(((%random%%%6)+1)*500)+7000 & set sizemod=7 & set size=Medium City"
if %size% equ Small_City set /a population=(((%random%%%6)+1)*500)+5000 & set sizemod=6 & set size=Small City"
if %size% equ Large_Town set /a population=(((%random%%%6)+1)*500)+2000 & set sizemod=5 & set size=Large Town"
if %size% equ Medium_Town set /a population=((%random%%%100)+10)+1000 & set sizemod=4 & set size=Medium Town"
if %size% equ Small_Town set /a population=((%random%%%8)+2)+200 & set sizemod=3 & set size=Small Town"
if %size% equ Village set /a population=((%random%%%8)+2)+200 & set sizemod=2
if %size% equ Hamlet set /a population=((%random%%%20)+2)+50 & set sizemod=1
if %size% equ Thorp set /a population=((%random%%%20)+2) & set sizemod=0
set /a roll=(%random%%%100+1)+%sizemod%
if %roll% geq 100 set popden=55k psm
if %roll% leq 99 if %roll% geq 98 set popden=who are crammed into extreemly close quarters
if %roll% leq 97 if %roll% geq 91 set popden=living in quite the dence urban environment
if %roll% leq 90 if %roll% geq 81 set popden=living in a fairly dence urban environment
if %roll% leq 80 if %roll% geq 21 set popden=with each having enough space to be comfortable
if %roll% leq 20 if %roll% geq 11 set popden=who enjoy fairly spacious yards
if %roll% leq 10 if %roll% geq 4 set popden=who enjoy extreemly spacious dwellings and yards
if %roll% leq 3 if %roll% geq 2 set popden=who deffently prefer their personal space, given the distance between dwellings
if %roll% leq 1 set popden=spread out almost unnaturaly far from one another
goto :eof

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

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

Как я уже упоминал в своем комментарии, индексированные переменные избавляют от многих головных болей. Как пример:

:townsize
@echo off & Setlocal EnableDelayedExpansion

REM Create primary Indexed variables
    Set "CitySz[1]=Thorp" & Set "PopDen[1]=spread out almost unnaturaly far from one another"
    Set "CitySz[2]=Hamlet" & Set "PopDen[2]=who enjoy extremely spacious dwellings and yards"
    Set "CitySz[3]=Village" & Set "PopDen[3]=who definitely prefer their personal space, given the distance between dwellings"
    Set "CitySz[4]=Small_Town" & Set "PopDen[4]=who enjoy fairly spacious yards"
    Set "CitySz[5]=Medium_Town" & Set "PopDen[5]=with each having enough space to be comfortable"
    Set "CitySz[6]=Large_Town" & Set "PopDen[6]=living in a fairly dense urban environment"
    Set "CitySz[7]=Small_City" & Set "PopDen[7]=living in quite the dense urban environment"
    Set "CitySz[8]=Medium_City" & Set "PopDen[8]=These folks Ride the train with no elbow room"
    Set "CitySz[9]=Large_City" & Set "PopDen[9]=who are crammed into extremely close quarters"
    Set "CitySz[10]=Metropolis" & Set "PopDen[10]=55k psm"

REM use substring modification to remove unwanted characters from the Town name
REM and assign the modified values to secondary indexed variables
For /L %%A in (1,1,10) do (
    Set "sCitySz[%%A]=!CitySz[%%A]:*_=!"
    Set "dCitySz[%%A]=!CitySz[%%A]:_= !"
    )

REM select the town Index
Set /A "type=%Random% %%10 + 1"

REM Calculate the population of the town
For %%A in (!CitySz[%type%]!) do (
    Set /A randMOD= type + 3
    Set /A randMULT= type * type * type
    Set /A randPLUS= type + 2
    Set Location[%type%]=%%A
    Set "%%A=Set /A population[%type%]= ( ( !random! %%!randMOD! + !randPLUS! ) * !randMULT! ) * type"
    !%%A!
)

REM use the index - type - value to access of the Related variables.
Echo.
Echo.Chosen City:
Echo(!CitySz[%Type%]! / !sCitySz[%Type%]! / !dCitySz[%Type%]! / !population[%Type%]! / !PopDen[%Type%]!
pause
Endlocal & Goto :townsize
1 голос
/ 09 апреля 2020

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

@Set /A "roll=(%random%%%100)+1" & SetLocal EnableDelayedExpansion & If !roll! GEq 56 (EndLocal & Set "size=Small Town" & Set "shortsize=town") Else EndLocal & Set "size=Big Town" & Set "shortsize=btwn"

Очевидно, что вы отрегулируете Else, как требуется, (я только что сделал это)!

[Test /]

@Set /A "roll=(%random%%%100)+1" & SetLocal EnableDelayedExpansion & If !roll! GEq 56 (EndLocal & Set "size=Small Town" & Set "shortsize=town") Else EndLocal & Set "size=Big Town" & Set "shortsize=btwn"
@Set roll
@Set size
@Set shortsize
@Pause

[Edit /]
… и просто чтобы показать вам, как вы недавно добавили, (через редактирование) , более полный сценарий будет выглядеть так:

@Echo Off

:TownSize
Set /A "roll=(%RANDOM% %% 100) + 1"

If %roll% LEq 5 (Set "size=Thorp" & Set "shortsize=thorp" & Set /A "population=((%RANDOM% %% 20) + 2), sizemod=0")
If %roll% GEq 6 (Set "size=Hamlet" & Set "shortsize=hamlet" & Set /A "population=((%RANDOM% %% 20) + 2) + 50, sizemod=1")
If %roll% GEq 11 (Set "size=Village" & Set "shortsize=village" & Set /A "population=((%RANDOM% %% 8) + 2) + 200, sizemod=2")
If %roll% GEq 56 (Set "size=Small Town" & Set "shortsize=town" & Set /A "population=((%RANDOM% %% 8) + 2) + 200, sizemod=3")
If %roll% GEq 66 (Set "size=Medium Town" & Set /A "population=((%RANDOM% %% 100) + 10) + 1000, sizemod=4")
If %roll% GEq 76 (Set "size=Large Town" & Set /A "population=(((%RANDOM% %% 6) + 1) * 500) + 2000, sizemod=5")
If %roll% GEq 86 (Set "size=Small City" & Set "shortsize=city" & Set /A "population=(((%RANDOM% %% 6) + 1) * 500) + 5000, sizemod=6")
If %roll% GEq 96 (Set "size=Medium City" & Set /A "population=(((%RANDOM% %% 6) + 1) * 500) + 7000, sizemod=7")
If %roll% Equ 99 (Set "size=Large City" & Set /A "population=(((%RANDOM% %% 15) + 2) * 1000) + 10000, sizemod=8")
If %roll% Equ 100 (Set "size=Metropolis" & Set "shortsize=metropolis" & Set /A "population=(((%RANDOM% %% 10) + 1) * 25000) + 125000, sizemod=9")

Rem Test the results
(Echo %%roll%%=%roll%, %%size%%=%size%, %%shortsize%%=%shortsize%, %%population%%=%population%, %%sizemod%%=%sizemod% & Pause)

Set /A "roll=((%RANDOM% %% 100) + 1) + sizemod"

If %roll% GEq 100 Set "popden=55k psm"
If %roll% Lss 100 Set "popden=who are crammed into extremely close quarters"
If %roll% Lss 98 Set "popden=living in quite a dense urban environment"
If %roll% Lss 91 Set "popden=living in a fairly dence urban environment"
If %roll% Lss 81 Set "popden=with each having enough space to be comfortable"
If %roll% Lss 21 Set "popden=who enjoy fairly spacious yards"
If %roll% Lss 11 Set "popden=who enjoy extremely spacious dwellings and yards"
If %roll% Lss 3 Set "popden=who definitely prefer their personal space, given the distance between dwellings"
If %roll% Equ 1 Set "popden=spread out almost unnaturaly far from one another"

Rem Test the results
(Echo %%roll%%=%roll%, %%popden%%=%popden% & Pause)

GoTo :EOF

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

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