Board logo

标题: 【已解决】支付宝20元求读取单个文件指定参数值并用用户输入值替换 [打印本页]

作者: iterzhou    时间: 2019-8-30 10:34     标题: 【已解决】支付宝20元求读取单个文件指定参数值并用用户输入值替换

需求如下:
我有一个文本文件:build.txt,我需要修改第14、17、18行的参数值,行数和参数名是固定的但是参数值不固定,先要在CMD窗口中显示原来的参数值,接着再提示用户输入新的参数值,然后用用户输入的值替换旧的参数值,保存到原文件当中。用户输入值的格式要跟原值来一样:如原参数值是数字的要限制用户输入值也是数字,原参数值是英文字符串的也要限制用户输入值是英文字符串。


我自己已经写了一部分代码,目前可以实现显示第14、17、18行的内容,也有提示用户输入,但是没有对用户输入值做处理。


以下是行数对应的整行内容。注意内容前面有空格
14      applicationId "com.daoliu.yo0507"
17    versionCode 470
18    versionName "0.6.0"

[attach]12138[/attach]
[attach]12139[/attach]
  1. @ECHO OFF
  2. for /f "skip=13 delims=" %%a in (build.txt) do (
  3. set txt1=%%~a
  4. goto :Show
  5. )
  6. :Show
  7. echo 当前applicationId是%txt1%
  8. set /p a=请输入新applicationId:
  9. @ECHO OFF
  10. for /f "skip=16 delims=" %%a in (build.txt) do (
  11. set txt2=%%~a
  12. goto :Show
  13. )
  14. :Show
  15. echo 当前versionCode是%txt2%
  16. set /p a=请输入新versionCode:
  17. @ECHO OFF
  18. for /f "skip=17 delims=" %%a in (build.txt) do (
  19. set txt3=%%~a
  20. goto :Show
  21. )
  22. :Show
  23. echo 当前versionName是%txt3%
  24. set /p a=请输入新versionCode:
  25. pause
复制代码

作者: iterzhou    时间: 2019-8-30 10:48

用户输入值的格式限制代码不好实现的话可以省去。
作者: zaqmlp    时间: 2019-8-30 12:15

  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. set "file=build.txt"
  7. powershell -NoProfile -ExecutionPolicy bypass ^
  8.     $Utf8NoBom=New-Object System.Text.UTF8Encoding $False;^
  9.     $text=[IO.File]::ReadAllLines('%file%',$Utf8NoBom);^
  10.     $a=[regex]::match($text[13],'^^(\s*?\S+\s+)(\S.+)');^
  11.     $b=[regex]::match($text[16],'^^(\s*?\S+\s+)(\S.+)');^
  12.     $c=[regex]::match($text[17],'^^(\s*?\S+\s+)(\S.+)');^
  13.     write-host ('当前applicationId:'+$a.groups[2].value);^
  14.     $f=$false;^
  15.     while($f -eq $false){^
  16.         $aa=read-host '请输入新applicationId';^
  17.         if($aa -match '^^\"[\.a-z\d]+\"$'){^
  18.             $f=$true;^
  19.         };^
  20.     };^
  21.     write-host $aa;^
  22.     $text[13]=$a.groups[1].value+$aa;^
  23.     write-host ('当前versionCode:'+$b.groups[2].value);^
  24.     $f=$false;^
  25.     while($f -eq $false){^
  26.         $bb=read-host '请输入新versionCode';^
  27.         if($bb -match '^^\d+$'){^
  28.             $f=$true;^
  29.         };^
  30.     };^
  31.     write-host $bb;^
  32.     $text[16]=$b.groups[1].value+$bb;^
  33.     write-host ('当前versionName:'+$c.groups[2].value);^
  34.     $f=$false;^
  35.     while($f -eq $false){^
  36.     $cc=read-host '请输入新versionName';^
  37.         if($cc -match '^^\"[\.\d]+\"$'){^
  38.             $f=$true;^
  39.         };^
  40.     };^
  41.     write-host $cc;^
  42.     $text[17]=$c.groups[1].value+$cc;^
  43.     [IO.File]::WriteAllLines('%file%', $text, $Utf8NoBom);
  44. echo;%info%
  45. pause
复制代码

作者: iterzhou    时间: 2019-8-30 13:29

回复 3# zaqmlp


    谢谢大谢投稿,脚本我已经测试了,基本满足要求,还有点小问题待完善。
作者: a20150604    时间: 2019-8-30 14:06

本帖最后由 a20150604 于 2019-8-30 14:46 编辑

屏幕输出示例:
  1. Active code page: 65001
  2.         1 file(s) copied.
  3. 当前 applicationId 是: "com.daoliu.yo0507"
  4. 请输入新的 applicationId:a.b.c..
  5. 参数格式不正确, 请再次输入.
  6. 请输入新的 applicationId:a.b.cd.3fg
  7. 当前 versionCode 是: 470
  8. 请输入新的 versionCode:853e
  9. 参数格式不正确, 请再次输入.
  10. 请输入新的 versionCode:654
  11. 当前 versionName 是: "0.6.0"
  12. 请输入新的 versionName:s.35.2wg
  13. 参数格式不正确, 请再次输入.
  14. 请输入新的 versionName:2.3.56.7
  15. The syntax of the command is incorrect.
  16. The syntax of the command is incorrect.
  17. DONE
  18. Press any key to continue . . .
复制代码
  1. @echo off & setlocal enabledelayedexpansion & chcp 65001
  2. set "QDH=[a-zA-Z][0-9a-zA-Z]*"
  3. set "QDN=\.[0-9a-zA-Z][0-9a-zA-Z]*"
  4. set "quote_domain=^\"%QDH%\"$ ^\"%QDH%%QDN%\"$ ^\"%QDH%%QDN%%QDN%\"$ ^\"%QDH%%QDN%%QDN%%QDN%\"$"
  5. set "domain=%quote_domain:\"=%"
  6. set "QDDH=[0-9][0-9]*"
  7. set "QDDN=\.%QDDH%"
  8. set "quote_dot_digit=^\"%QDDH%\"$ ^\"%QDDH%%QDDN%\"$ ^\"%QDDH%%QDDN%%QDDN%\"$ ^\"%QDDH%%QDDN%%QDDN%%QDDN%\"$"
  9. set "dot_digit=%quote_dot_digit:\"=%"
  10. set "pure_digit=^%QDDH%$"
  11. call :wmic_get_timestamp YYYYMMDD_HHiiss
  12. copy /y build.txt build.BAK.%YYYYMMDD_HHiiss%.txt
  13. > build.txt cd.
  14. for /f "delims=" %%a in (build.BAK.%YYYYMMDD_HHiiss%.txt) do (
  15.     REM 过滤出目标参数行
  16.     echo;%%a|findstr /r /i "[^0-9a-zA-Z\.]applicationId [^0-9a-zA-Z\.]versionCode [^0-9a-zA-Z\.]versionName" >nul && (
  17.         REM echo;&echo;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  18.         REM echo;found target param line:&echo;
  19.         for /f "tokens=1*" %%c in ("%%a") do (
  20.             
  21.             echo;当前 %%c 是: %%d
  22.         
  23.             for %%e in (quote_domain pure_digit quote_dot_digit) do (
  24.                 set "validate_str=!%%e!"
  25.                 set "types=%%e"
  26.                 if "!types:~0,6!"=="quote_" (
  27.                     set "types=!types! !types:~6!"
  28.                 )
  29.                 echo;%%d|findstr /r /i "!validate_str!" >nul && (
  30.                     call :input_param param_val %%c !types!
  31.                 )
  32.             )
  33.             >> build.txt echo;%%c !param_val!
  34.             REM echo;++++++++++++++++ new set ++++++++++++++++
  35.             REM echo;%%c !param_val!
  36.         )
  37.     ) || (
  38.         >> build.txt echo;%%a
  39.         REM echo;%%a
  40.     )
  41. )
  42. echo;DONE
  43. pause
  44. exit
  45. :input_param var_param_val param_name validate_type no_quote_validate_type
  46. setlocal
  47. if "%~4" neq "" (
  48.     set "no_quote_validate_type= !%~4!"
  49. )
  50. :input_param_loop
  51. set /p "param_val=请输入新的 %~2:"
  52. echo;%param_val%| findstr /r /i "!%~3!!no_quote_validate_type!" >nul && (
  53.     (
  54.         endlocal
  55.         set "%~1=%param_val%"
  56.         if "%~4" neq "" (
  57.             for %%a in (%param_val%) do set "%~1="%%~a""
  58.         )
  59.         exit /b
  60.     )
  61. ) || (
  62.     echo;参数格式不正确, 请再次输入.
  63.     goto :input_param_loop
  64. )
  65. exit /b
  66. :wmic_get_timestamp YYYYMMDD_HHiiss
  67. setlocal
  68. for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do (
  69.     for /f "tokens=1-2 delims==" %%a in ("%%x") do (set "_%%a=0000%%b")
  70. )
  71. (
  72.     endlocal
  73.     set "%~1=%_Year:~-4%%_Month:~-2%%_Day:~-2%_%_Hour:~-2%%_Minute:~-2%%_Second:~-2%"
  74.     exit /b
  75. )
复制代码

作者: iterzhou    时间: 2019-8-30 17:24

回复 5# a20150604


    谢谢投稿,由于在你之前有人投稿,我已经采纳他的脚本了,赏金也已兑现,所以不能支付你报酬了,请谅解!




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2