无法创建批处理脚本以从XML文件中提取行

时间:2017-08-13 01:46:36

标签: xml batch-file

因此,我一直在尝试编写一个批处理脚本,该脚本将通过AndroidManifest.xml并提取应用程序中使用的权限并将其输出到.txt文件以进行工作,而不必手动执行。我的工作的一部分是在开发人员的后面,并编写应用程序中使用的所有权限,以确保它们实际使用,而不仅仅是无用的代码,因此拥有一个权限列表只需跳转到您将使x100更快。< / p>

例如,在xml中有一些看起来像这样的行:

<uses-permission android:name="android.permission.VIBRATE"/>

我正在尝试将它们添加到输出文件中:

android.permission.VIBRATE

到.txt文件。

目前,我在输出中获得了正确的行数,而不是我获得的权限:

!line!

我从关于处理XML文件的类似事情的在线示例和教程中编写的代码如下:

ECHO off
REM new line added to fix output below thanks to Compo
SETLOCAL enabledelayedexpansion

:start

ECHO Note: Find your list of permissions used in the permissions output file
ECHO Please input the file path to the AndroidManifest you'd like scrapped for permissions 

SET /p manifestpath=
ECHO Verifying inputted path:
ECHO %manifestpath%

CD "%manifestpath%"

(FOR /f "usebackqtokens=1-7delims=<=>/ " %%a IN (AndroidManifest.xml) DO (
 IF /i "%%~a%%~b"=="uses-permissionandroid:name" ECHO "%%~c"
)) > permissionsoutput.txt

START permissionsoutput.txt

ECHO to run again enter 'r'
ECHO to exit enter 'e'

SET /p nextaction=
if %nextaction%==r goto :start
if %nextaction%==e :eof

更新:真棒,它实际上还有其他的东西!行!现在。但是我需要做什么才能从当前输出中获取权限: 机器人:名称= “android.permission.WRITE_EXTERNAL_STORAGE”/&GT; 类似于: android.permission.WRITE_EXTERNAL_STORAGE

更新:完全正常工作!上面的代码应该完全适用于需要它作为另一个项目的参考的任何人。

1 个答案:

答案 0 :(得分:1)

@echo off之后,插入一个新行

setlocal enabledelayedexpansion

delayedexpansion模式导致!var!成为var当前

从发布的行中检索android.permission.WRITE_EXTERNAL_STORAGE(请将实际行编辑为原始问题 - 与XML争论的评论)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q45656376.txt"
FOR /f "usebackqtokens=1-7delims=<=>/ " %%a IN ("%filename1%") DO (
 IF /i "%%~a%%~b"=="uses-permissionandroid:name" ECHO "%%~c"
)

GOTO :EOF

我为了方便在我的系统上构建filename1,以包含一些随机XML,包括你的行。

阅读文件,将<=>/作为分隔符;选择第三个并删除引号。

此代码旨在演示如何从文件中提取所需数据。前4行只是设置源文件名&gt;我使用这个结构进行测试,以便在出现任何问题时可以轻松修改代码 - 并将所有与问题相关的数据保存在相关的文件集中(因此我的批处理将在此处case为q45656376.bat,任何相关数据文件为q45656376.txt等)

最后的goto :eof是多余的代码 - 我采用这种习惯来减少向任何批次添加子程序的问题。

所有剩下的就是for声明。此语句应替换您日常工作中已有的for/f。然后,您需要将目标文件名更改为"AndroidManifest.xml"并删除%%~c周围的引号(如果您愿意) - 我使用引号直观地确认没有输出额外的空格。

请注意for语句is parenthesised(for ...)&gt; filename . This is used to redirect theed output from the for`语句回显to a file instead of to the console. You'd need to parenthesise the生成输出文件。