Не могу ввести переменную в DOS - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь запустить командный файл в vDOS (эмулятор DOS), где я хочу, чтобы пользователь ввел две переменные. Каждый раз, когда я запускаю файл, он не позволяет мне вводить переменные.

SET /P in=Input:
SET /P out=Output:

Я ожидал, что это позволит мне ввести данные для переменных. Вместо этого он выполняет обе команды в том виде, в каком они есть (не позволяя мне ввести данные).

Ответы [ 3 ]

3 голосов
/ 31 октября 2019

Windows cmd и MS-DOS - это очень разные вещи , и одним из отличий является команда set. В MS-DOS единственная форма набора - set variable=value. Нет ни set /A, set "variable=value", ни set /P.

set /P является функцией cmd.exe в Windows NT. В DOS вы должны использовать стороннее программное обеспечение 3 rd для получения пользовательского ввода и сохранения в переменной. Вот некоторые решения

  • SENVAR.COM

    SENVAR INPUT Input string:
    
  • EDITVAR и CHOOSE

    editvar -p "Input string: " INPUT
    
  • FC.COM

    @echo off
    :: based on batch from PC Magazine June 27, 1995 page 248
    :: this version puts temps in C:\DOS dir and shortens var names
    :: User input is returned in variable STR
    :input
    > C:\DOS\en#er.bat fc con nul /lb1 /n|date|find "    1:  "
    > C:\DOS\enter.bat echo set str=
    >>C:\DOS\enter.bat echo :loop
    >>C:\DOS\enter.bat echo if not '%%str%%==' set str=%%str%% %%5
    >>C:\DOS\enter.bat echo if '%%str%%==' set str=%%5
    >>C:\DOS\enter.bat echo shift
    >>C:\DOS\enter.bat echo if not '%%5==' goto loop
    call en#er.bat
    del C:\DOS\enter.bat
    del C:\DOS\en#er.bat
    
  • ANSI.SYS

    @ECHO OFF
    
    REM * Ask for USeR INPUT and store it in variable USRINPUT
    REM * Assumes ANSI.SYS is loaded
    REM * Written by Rob van der Woude
    
    SET USRINPUT=
    
    REM * Turn on ANSI key translation (translate Enter
    REM * key to F6+Enter sequence) and ask for input:
    ECHO ←[13;0;64;13pEnter one word only . . .
    
    REM * Copy entered text to temporary file:
    COPY CON %TEMP%.\~USRINP.TMP
    
    REM * Turn off ANSI key translation and clear irrelevant screen output:
    ECHO ←[13;13p←[3A←[K←[1B←[K←[1B←[K←[2A
    
    REM * Add empty line to temporary file. The empty line
    REM * will be used to stop DATE asking for new date.
    ECHO.>> %TEMP%.\~USRINP.TMP
    ECHO.>> %TEMP%.\~USRINP.TMP
    
    
    REM * Create a temporary batch file that will store the
    REM * entered text into the environment variable USRINPUT:
    TYPE %TEMP%.\~USRINP.TMP | DATE | FIND "):" > %TEMP%.\~USRINP.BAT
    
    REM * Create more temporary batch files. Add
    REM * more command line parameters if necessary,
    REM * as in: ECHO SET USRINPUT=%%3 %%4 %%5 %%6 %%7 %%8 %%9>CURRENT.BAT
    ECHO SET USRINPUT=%%3>CURRENT.BAT
    
    REM * VOER.BAT and TYP.BAT are replacements for CURRENT.BAT for Dutch
    REM * DOS versions; add your own language versions if necessary:
    ECHO SET USRINPUT=%%6>VOER.BAT
    ECHO SET USRINPUT=%%4>TYP.BAT
    
    REM * This temporary batch file now sets the variable USRINPUT:
    CALL %TEMP%.\~USRINP.BAT
    
    REM * Display the result:
    ECHO You typed: ←[1m%USRINPUT%←[0m
    ECHO.
    PAUSE
    
    REM * Finally, clean up the mess of temporary files:
    FOR %%A IN (%TEMP%.\~USRINP.BAT %TEMP%.\~USRINP.TMP VOER.BAT TYP.BAT CURRENT.BAT) DO DEL %%A
    

    ← - это escape-символ (27h)

В случае, если вы просто хотите получить простые ответы, такие как Y / Nтогда CHOICE.COM предназначен для этой цели

См. также

1 голос
/ 31 октября 2019

/P не было введено до Windows 2000 или NT. У Legacy MS-DOS или аналога его не будет. https://www.computerhope.com/sethlp.htm

0 голосов
/ 06 ноября 2019

CMD и DOS очень разные. Интерпретаторы DOS, такие как command.com, не могут устанавливать переменные, используя set / a или set / p. Однако вы можете попробовать это:

@echo off<br> echo Input:<br> for %%a in ('type con') do echo %%a >tmpinput.txt & goto next<br> :next<br> echo Output:<br> for %%b in ('type con') do echo %%b >tmpoutput.txt & goto next2<br> :next<br> set in= set out= del tempinput.txt<br> del tmpoutput.txt<br>

Это действительно будет работать в command.com. Это также работает в cmd, но я не рекомендую это там.

...