yechengzhou 发表于 2018-7-2 15:56:28

各位前辈,请教 set/p 输入内容的问题[已解决]

本帖最后由 yechengzhou 于 2018-7-5 15:05 编辑

各位前辈,请教 set/p 输入内容的问题

比如输入以下特殊符号按回车后会终止批处理的执行并退出
|
&
<
>
有解决办法的方案吗?

已找到的方案,请各位测试...

@echo off
setlocal enabledelayedexpansion
:x
cls
set ^a=z
set/p ^a=请选择:
set str=!^a!
set str=!str!fedcba9876543210&set/a len=0x!str:~15,1!
if %len% gtr 1 goto x
if !^a!==^| goto x
if !^a!==^& goto x
if !^a!==^< goto x
if !^a!==^> goto x
if !^a!==^" goto x
if !^a!==^^ goto x
if !^a!==^; goto x
if !^a!==^, goto x
if !^a!==^= goto x
if !^a!==^^! goto x
if !^a!==z goto x
if !^a!==1 goto y
if !^a!==2 goto y
if !^a!==3 goto y
if !^a!==4 goto y
if !^a!==0 exit
goto x
:y
echo 你好
pause
goto x

这种方案简洁
@echo off
setlocal enabledelayedexpansion
:x
cls
set/p ^str=请选择:
for %%i in ( ^echo !^str!^ ) do (set str1=%%i)
if not !^str!==!str1! goto x
if !^str!==0 goto y
if !^str!==1 goto y
if !^str!==2 goto y
goto x
:y
echo 你好
pause
goto x

用在更改文件名称的方案:
@echo off
setlocal enabledelayedexpansion
:x
cls
set/p ^str=请输入一新的有效文件名称(不包括扩展名):
for /f tokens^=1-2^ delims^=^" %%i in ('echo !^str!') do set ^str1=%%i
if !^str! gtr !^str1! goto x
set str2=^!^str:~0,1!
if "%str2%"==" " goto x
@echo off>%cd%\log_files\^!^str!.123
if exist %cd%\log_files\.123 del %cd%\log_files\.123
if not exist %cd%\log_files\!^str!.123 (goto x) else (goto y)
goto x
:y
del %cd%\log_files\*.123
echo !^str!
pause
goto x

holley2008 发表于 2018-7-2 16:22:30

因为这些是管道符、连接符和重定向符

nttwqz 发表于 2018-7-2 17:51:23

set /p "input="

chiannet 发表于 2018-7-3 18:06:25

本帖最后由 chiannet 于 2018-7-3 18:11 编辑

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "TP=%~DP0"
REM 原始.TXT所在路径名,赋值给TP,以“\”结尾。
IF NOT EXIST "%TP%原始.TXT" (ECHO.&ECHO 未发现"%TP%原始.TXT"
PAUSE >NUL&CLS&EXIT)

:N
CLS&ECHO.&ECHO.&ECHO.&ECHO.
SET /P ^F=输入定位符号/字符串并回车:
SET ^A=!^F!
SET /A FSL=0
:FSL
        SET ^A=!^A:~0,-1!
        SET /A FSL+=1
        IF "!A!"=="" GOTO M       
GOTO FSL

:M
IF %FSL% EQU 1 (SET SY=符号) ELSE (SET SY=字符串)
CLS&SET AX=
ECHO.&ECHO.
ECHO.&ECHO            按需求变换“原始.TXT”中每行字符串
ECHO.&ECHO.
ECHO.&ECHO      1、取得最左“!^F!”之前的字符
ECHO.&ECHO      2、取得最左“!^F!”之后的字符
ECHO.&ECHO      3、取得最右“!^F!”之前的字符
ECHO.&ECHO      4、取得最右“!^F!”之后的字符
ECHO.&ECHO      5、退出
ECHO.&ECHO.
SET /P S=输入代码并回车:
IF NOT "%S%"=="" SET S=%S:~0,1%
IF %S% EQU 1 (SET AX=左&SET BX=前)
IF %S% EQU 2 (SET AX=左&SET BX=后)
IF %S% EQU 3 (SET AX=右&SET BX=前)
IF %S% EQU 4 (SET AX=右&SET BX=后)
IF %S% EQU 5 EXIT
IF "%AX%"=="" (ECHO.&ECHO 输入无效,请重新输入!
PAUSE >NUL&CLS&GOTO M)
SET PT="%TP%最%AX%定位%SY%之%BX%的字符.TXT"
DEL %PT% /F >NUL 2>NUL
FOR /F "DELIMS=" %%I IN ('TYPE "%TP%原始.TXT"')DO(
SET ^A=%%I
SET ^B=%%I
CALL :L "!^B!"
)
IF EXIST %PT% (CLS&ECHO.&ECHO %PT% 已创建。&ECHO.&ECHO.&PAUSE)
GOTO N

:L
IF %S% EQU 1 (SET ^C=!^B:~0,%FSL%!
        IF !^C!==!^F! (SET ^R=“!^F!”位于此行首位。&GOTO E))
IF %S% EQU 4 (SET ^C=!^B:~-%FSL%!
        IF !^C!==!^F! (SET ^R=“!^F!”位于此行末尾。&GOTO E))
SET ^R=此行找不到指定的定位%SY%“!^F!”!&SET /A N=%FSL%

:R
SET /A M=%N%-%FSL%

IF %S% EQU 4 (
        SET ^B=!^A:~-%N%!
        SET ^D=!^B:~0,%FSL%!
        IF !^D!==!^F! (SET ^R=!^A:~-%M%!&GOTO E)
        IF !^B!==!A! GOTO E
)

IF %S% EQU 3(
        SET ^D=!^B:~-%FSL%,%FSL%!
        IF !^D!==!^F!(SET ^R=!^B:~0,-%FSL%!&GOTO E)
        SET ^B=!^B:~0,-1!
)

IF %S% EQU 2(SET ^D=!^B:~0,%FSL%!
        IF !^D!==!^F!(SET ^R=!^B:~%FSL%,100000!&GOTO E)
        SET ^B=!^B:~1,100000!
)

IF %S% EQU 1(
        SET ^B=!^A:~0,%N%!
        SET ^D=!^B:~-%FSL%!
        IF !^D!==!^F!(SET ^R=!^A:~0,%M%!&GOTO E)
        IF !^B!==!^A! GOTO E
)

SET /A N+=1
IF %S% GTR 1 (IF %S% LSS 4 (IF "!B!"=="" GOTO E))
GOTO R

:E
IF %S% GTR 1 (IF %S% LSS 4 (IF "!R!"=="" SET ^R=有且仅有一个“!^F!”位于此行最%BX%位。))
ECHO !^R!>>%PT%
GOTO :EOF








这是个综合应用







chiannet 发表于 2018-7-3 22:14:32

chiannet 发表于 2018-7-3 18:06
这是个综合应用

发现上面的批处理处理不了"!"做定位符。

yechengzhou 发表于 2018-7-5 13:24:37

chiannet 发表于 2018-7-3 22:14
发现上面的批处理处理不了"!"做定位符。

@echo off
setlocal enabledelayedexpansion
::假设 1.txt 的内容为:1245.55!45
type 1.txt
echo.
for /f tokens^=1-2^ delims^=^! %%i in ( 'type 1.txt' ) do (echo %%i)
pause
请测试.
页: [1]
查看完整版本: 各位前辈,请教 set/p 输入内容的问题[已解决]