无忧启动论坛

标题: 各位前辈,请教 set/p 输入内容的问题[已解决] [打印本页]

作者: yechengzhou    时间: 2018-7-2 15:56
标题: 各位前辈,请教 set/p 输入内容的问题[已解决]
本帖最后由 yechengzhou 于 2018-7-5 15:05 编辑

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

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

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

@echo off
setlocal enabledelayedexpansion
:x
cls
set ^a=z
set/p ^a=请选择[0-4]:
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=请选择[0-2]:
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
因为这些是管道符、连接符和重定向符
作者: nttwqz    时间: 2018-7-2 17:51
set /p "input="
作者: chiannet    时间: 2018-7-3 18:06
本帖最后由 chiannet 于 2018-7-3 18:11 编辑
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. SET "TP=%~DP0"
  4. REM 原始.TXT所在路径名,赋值给TP,以“\”结尾。
  5. IF NOT EXIST "%TP%原始.TXT" (ECHO.&ECHO 未发现"%TP%原始.TXT"
  6. PAUSE >NUL&CLS&EXIT)

  7. :N
  8. CLS&ECHO.&ECHO.&ECHO.&ECHO.
  9. SET /P ^F=输入定位符号/字符串并回车:
  10. SET ^A=!^F!
  11. SET /A FSL=0
  12. :FSL
  13.         SET ^A=!^A:~0,-1!
  14.         SET /A FSL+=1
  15.         IF "!A!"=="" GOTO M       
  16. GOTO FSL

  17. :M
  18. IF %FSL% EQU 1 (SET SY=符号) ELSE (SET SY=字符串)
  19. CLS&SET AX=
  20. ECHO.&ECHO.
  21. ECHO.&ECHO              按需求变换“原始.TXT”中每行字符串
  22. ECHO.&ECHO.
  23. ECHO.&ECHO        1、取得最左“!^F!”之前的字符
  24. ECHO.&ECHO        2、取得最左“!^F!”之后的字符
  25. ECHO.&ECHO        3、取得最右“!^F!”之前的字符
  26. ECHO.&ECHO        4、取得最右“!^F!”之后的字符
  27. ECHO.&ECHO        5、退出
  28. ECHO.&ECHO.
  29. SET /P S=输入代码并回车:
  30. IF NOT "%S%"=="" SET S=%S:~0,1%
  31. IF %S% EQU 1 (SET AX=左&SET BX=前)
  32. IF %S% EQU 2 (SET AX=左&SET BX=后)
  33. IF %S% EQU 3 (SET AX=右&SET BX=前)
  34. IF %S% EQU 4 (SET AX=右&SET BX=后)
  35. IF %S% EQU 5 EXIT
  36. IF "%AX%"=="" (ECHO.&ECHO 输入无效,请重新输入!
  37. PAUSE >NUL&CLS&GOTO M)
  38. SET PT="%TP%最%AX%定位%SY%之%BX%的字符.TXT"
  39. DEL %PT% /F >NUL 2>NUL
  40. FOR /F "DELIMS=" %%I IN ('TYPE "%TP%原始.TXT"')  DO  (
  41. SET ^A=%%I
  42. SET ^B=%%I
  43. CALL :L "!^B!"
  44. )
  45. IF EXIST %PT% (CLS&ECHO.&ECHO %PT% 已创建。&ECHO.&ECHO.&PAUSE)
  46. GOTO N

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

  53. :R
  54. SET /A M=%N%-%FSL%

  55. IF %S% EQU 4 (
  56.         SET ^B=!^A:~-%N%!
  57.         SET ^D=!^B:~0,%FSL%!
  58.         IF !^D!==!^F! (SET ^R=!^A:~-%M%!&GOTO E)
  59.         IF !^B!==!A! GOTO E
  60. )

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

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

  70. IF %S% EQU 1  (
  71.         SET ^B=!^A:~0,%N%!
  72.         SET ^D=!^B:~-%FSL%!
  73.         IF !^D!==!^F!  (SET ^R=!^A:~0,%M%!&GOTO E)
  74.         IF !^B!==!^A! GOTO E
  75. )

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

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








这是个综合应用

截取特征符号前后的字符.7z (1.15 KB, 下载次数: 4)






作者: chiannet    时间: 2018-7-3 22:14
chiannet 发表于 2018-7-3 18:06
这是个综合应用

发现上面的批处理处理不了"!"做定位符。
作者: yechengzhou    时间: 2018-7-5 13:24
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
请测试.




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3