如何通过1个批处理脚本增加给定文件的int变量的值

时间:2019-03-27 11:25:35

标签: batch-file

每次运行批处理脚本时,我需要将int变量versionCode的值加1。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" package="com.sisapp.in.globalthesc" android:versionName="2.5" android:versionCode="8">
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
    <supports-screens android:resizeable="true"  android:largeScreens="true"/>
    <application android:icon="@drawable/sisIconLaunch">        
        <receiver android:name=".DeviceBootReceiver" />
    </application>
</manifest>

我正在使用的这段代码将versionCode恢复为1,如果没有增加1,则返回1。

@echo off
setlocal enabledelayedexpansion
set "inputfile=D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml"

    for /f tokens^=10^delims^=^" %%i in ('type "%inputfile%" ^| findstr "android:versionCode"') do set vers=%%i
    for /f "tokens=1,2 delims=." %%i in ("!vers!") do (
         set decia=%%i

        set /a decia+=1    
        set newver=!decia!
    )
    for /f "tokens=*" %%a in ('type "%inputfile%" ^| find /v /n "" ^& break ^> "%inputfile%"') do (
         set "str=%%a"
         call set "str=%%str:*]=%%"
         if "!str:~0,15!" == "<manifest xmlns" set "str=!str:%vers%=%newver%!"
         >>%inputfile% echo(!str!
  )

2 个答案:

答案 0 :(得分:2)

previous question批处理中明确规定的方法不是最佳的工具,并且如果xml格式以任何方式更改,尤其是在<manifest行中,则将无效。因此,无论如何,这是一个组合脚本(上一个问题)和这个脚本。试试看,让我知道。

@echo off
setlocal enabledelayedexpansion
set "inputfile=D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml"

for /f tokens^=8^,10delims^=^" %%i in ('type "%inputfile%" ^| findstr "android:versionName"') do (
    set vers=%%i
    set code=%%j
)
for /f "tokens=1,2 delims=." %%i in ("!vers!") do (
     set decia=%%i
     set decib=%%j
     if "!decib!" lss "9" (
            set /a decib+=1
      ) else (
            set decib=0
            set /a decia+=1
    )
    set newver=!decia!.!decib!
)
for /f "tokens=1" %%i in ("!code!") do (
     set cnt=%%i
     set /a cnt+=1
)
set newcode=!cnt!
for /f "tokens=*" %%a in ('type "%inputfile%" ^| find /v /n "" ^& break ^> "%inputfile%"') do (
     set "str=%%a"
     call set "str=%%str:*]=%%"
     if "!str:~0,15!" == "<manifest xmlns" set "str=!str:"%vers%"="%newver%"!"
     if "!str:~0,15!" == "<manifest xmlns" set "str=!str:"%code%"="%newcode%"!"
     >>%inputfile% echo(!str!
)

出现问题的原因是因为您将旧代码和新代码中的变量名混合在一起。同样,这将设置一个值,因为在整个脚本中运行相同的搜索,旧内容将更新为新内容,因此,这不是最佳解决方案,powershell会是一个更好的解决方案。但是我在替换内容中加入了一些双引号,以尝试更加具体,但这并不完美。

答案 1 :(得分:2)

如上一个问题中所述,请使用xml工具更好地处理xml文件。

批处理不太适合此任务。 OTOH PowerShell ,可以批量使用,并且UTF8编码没有问题。

Powershell

function customPop(e) {
    // your own code
    console.log(e);
}

layer.bindPopup('the popup text'); // delete it, if you don't want the popup
layer.on('contextmenu', customPop); // contextmenu or other events

要成批包装:

$File = 'D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml'
$xml = New-Object XML
$xml.Load($File)
$xml.manifest.Versioncode = [string]([int]$xml.manifest.Versioncode +1)
$xml.manifest.VersionName = [string]([double]$xml.manifest.VersionName +.1)
$xml.Save($File)

另一个不太理想的解决方案是使用RegEx(此处带有环顾四周)PowerShell

@echo off
set "inputfile=D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml"
powershell -NoP -NoLogo -C "$File='%inputfile%';$xml = New-Object XML;$xml.Load($File);$xml.manifest.Versioncode = [string]([int]$xml.manifest.Versioncode +1);$xml.manifest.VersionName = [string]([double]$xml.manifest.VersionName +.1);$xml.Save($File)"

它可以类似地包装在批处理文件中。