返回列表 发帖

【已解决】支付宝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]
@ECHO OFF
for /f "skip=13 delims=" %%a in (build.txt) do (
set txt1=%%~a
goto :Show
)
:Show
echo 当前applicationId是%txt1%
set /p a=请输入新applicationId:
@ECHO OFF
for /f "skip=16 delims=" %%a in (build.txt) do (
set txt2=%%~a
goto :Show
)
:Show
echo 当前versionCode是%txt2%
set /p a=请输入新versionCode:
@ECHO OFF
for /f "skip=17 delims=" %%a in (build.txt) do (
set txt3=%%~a
goto :Show
)
:Show
echo 当前versionName是%txt3%
set /p a=请输入新versionCode:
pauseCOPY

用户输入值的格式限制代码不好实现的话可以省去。

TOP

@echo off
set info=互助互利,支付宝扫码头像,感谢赞助
rem 有问题,可加QQ956535081及时沟通
title %info%
cd /d "%~dp0"
set "file=build.txt"
powershell -NoProfile -ExecutionPolicy bypass ^
    $Utf8NoBom=New-Object System.Text.UTF8Encoding $False;^
    $text=[IO.File]::ReadAllLines('%file%',$Utf8NoBom);^
    $a=[regex]::match($text[13],'^^(\s*?\S+\s+)(\S.+)');^
    $b=[regex]::match($text[16],'^^(\s*?\S+\s+)(\S.+)');^
    $c=[regex]::match($text[17],'^^(\s*?\S+\s+)(\S.+)');^
    write-host ('当前applicationId:'+$a.groups[2].value);^
    $f=$false;^
    while($f -eq $false){^
        $aa=read-host '请输入新applicationId';^
        if($aa -match '^^\"[\.a-z\d]+\"$'){^
            $f=$true;^
        };^
    };^
    write-host $aa;^
    $text[13]=$a.groups[1].value+$aa;^
    write-host ('当前versionCode:'+$b.groups[2].value);^
    $f=$false;^
    while($f -eq $false){^
        $bb=read-host '请输入新versionCode';^
        if($bb -match '^^\d+$'){^
            $f=$true;^
        };^
    };^
    write-host $bb;^
    $text[16]=$b.groups[1].value+$bb;^
    write-host ('当前versionName:'+$c.groups[2].value);^
    $f=$false;^
    while($f -eq $false){^
    $cc=read-host '请输入新versionName';^
        if($cc -match '^^\"[\.\d]+\"$'){^
            $f=$true;^
        };^
    };^
    write-host $cc;^
    $text[17]=$c.groups[1].value+$cc;^
    [IO.File]::WriteAllLines('%file%', $text, $Utf8NoBom);
echo;%info%
pauseCOPY
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 3# zaqmlp


    谢谢大谢投稿,脚本我已经测试了,基本满足要求,还有点小问题待完善。

TOP

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

屏幕输出示例:
Active code page: 65001
        1 file(s) copied.
当前 applicationId 是: "com.daoliu.yo0507"
请输入新的 applicationId:a.b.c..
参数格式不正确, 请再次输入.
请输入新的 applicationId:a.b.cd.3fg
当前 versionCode 是: 470
请输入新的 versionCode:853e
参数格式不正确, 请再次输入.
请输入新的 versionCode:654
当前 versionName 是: "0.6.0"
请输入新的 versionName:s.35.2wg
参数格式不正确, 请再次输入.
请输入新的 versionName:2.3.56.7
The syntax of the command is incorrect.
The syntax of the command is incorrect.
DONE
Press any key to continue . . .COPY
@echo off & setlocal enabledelayedexpansion & chcp 65001
set "QDH=[a-zA-Z][0-9a-zA-Z]*"
set "QDN=\.[0-9a-zA-Z][0-9a-zA-Z]*"
set "quote_domain=^\"%QDH%\"$ ^\"%QDH%%QDN%\"$ ^\"%QDH%%QDN%%QDN%\"$ ^\"%QDH%%QDN%%QDN%%QDN%\"$"
set "domain=%quote_domain:\"=%"
set "QDDH=[0-9][0-9]*"
set "QDDN=\.%QDDH%"
set "quote_dot_digit=^\"%QDDH%\"$ ^\"%QDDH%%QDDN%\"$ ^\"%QDDH%%QDDN%%QDDN%\"$ ^\"%QDDH%%QDDN%%QDDN%%QDDN%\"$"
set "dot_digit=%quote_dot_digit:\"=%"
set "pure_digit=^%QDDH%$"
call :wmic_get_timestamp YYYYMMDD_HHiiss
copy /y build.txt build.BAK.%YYYYMMDD_HHiiss%.txt
> build.txt cd.
for /f "delims=" %%a in (build.BAK.%YYYYMMDD_HHiiss%.txt) do (
    REM 过滤出目标参数行
    echo;%%a|findstr /r /i "[^0-9a-zA-Z\.]applicationId [^0-9a-zA-Z\.]versionCode [^0-9a-zA-Z\.]versionName" >nul && (
        REM echo;&echo;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        REM echo;found target param line:&echo;
        for /f "tokens=1*" %%c in ("%%a") do (
            
            echo;当前 %%c 是: %%d
        
            for %%e in (quote_domain pure_digit quote_dot_digit) do (
                set "validate_str=!%%e!"
                set "types=%%e"
                if "!types:~0,6!"=="quote_" (
                    set "types=!types! !types:~6!"
                )
                echo;%%d|findstr /r /i "!validate_str!" >nul && (
                    call :input_param param_val %%c !types!
                )
            )
            >> build.txt echo;%%c !param_val!
            REM echo;++++++++++++++++ new set ++++++++++++++++
            REM echo;%%c !param_val!
        )
    ) || (
        >> build.txt echo;%%a
        REM echo;%%a
    )
)
echo;DONE
pause
exit
:input_param var_param_val param_name validate_type no_quote_validate_type
setlocal
if "%~4" neq "" (
    set "no_quote_validate_type= !%~4!"
)
:input_param_loop
set /p "param_val=请输入新的 %~2:"
echo;%param_val%| findstr /r /i "!%~3!!no_quote_validate_type!" >nul && (
    (
        endlocal
        set "%~1=%param_val%"
        if "%~4" neq "" (
            for %%a in (%param_val%) do set "%~1="%%~a""
        )
        exit /b
    )
) || (
    echo;参数格式不正确, 请再次输入.
    goto :input_param_loop
)
exit /b
:wmic_get_timestamp YYYYMMDD_HHiiss
setlocal
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do (
    for /f "tokens=1-2 delims==" %%a in ("%%x") do (set "_%%a=0000%%b")
)
(
    endlocal
    set "%~1=%_Year:~-4%%_Month:~-2%%_Day:~-2%_%_Hour:~-2%%_Minute:~-2%%_Second:~-2%"
    exit /b
)COPY

TOP

回复 5# a20150604


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

TOP

返回列表