Batch file 使用批处理删除字符串的部分

Batch file 使用批处理删除字符串的部分,batch-file,Batch File,您好,我正在处理此文件,似乎无法回避此问题 现在,如果我为所有字符串制作了许多脚本,这将非常有用 但是我真的很想在制作一个脚本方面得到帮助 @echo off SetLocal EnableDelayedExpansion set input=asset_database_Release.txt set output=asset_database_Release_ready.txt set "substr={"code":"*_icon",&q

您好,我正在处理此文件,似乎无法回避此问题
现在,如果我为所有字符串制作了许多脚本,这将非常有用
但是我真的很想在制作一个脚本方面得到帮助

@echo off
SetLocal EnableDelayedExpansion

set input=asset_database_Release.txt
set output=asset_database_Release_ready.txt
set "substr={"code":"*_icon","type":"?","version":"??"},"

(
    FOR /F "usebackq delims=" %%G IN ("%input%") DO (
        set line=%%G
        echo. !line:%substr%=!
    )
) > "%output%"

EndLocal
exit /b 0
在我的文本文件中,有1000个字符串如下所示

{"code":"The_Great_Place_icon","type":"8","version":"80"},"
{"code":"The_Great_Area_icon","type":"10","version":"60"},"
{"code":"The_Great_Earth_icon","type":"23","version":"75"},"
如果我这样设置脚本,它将工作,并且只删除该部分

set "substr={"code":""
set "substr=_icon","type":"8","version":"80"},"
如果我制作了第二个脚本,并像这样设置了then脚本,它会工作,并且只删除该部分

set "substr={"code":""
set "substr=_icon","type":"8","version":"80"},"
但是我必须制作1000多个脚本来清除多余的不需要的
结果应该是这样的

The_Great_Place
The_Great_Area
The_Great_Earth

您可以进入“编辑”菜单并按“查找”选项,然后键入需要删除的1000行的文本,因为它们都以相同的输入开始,然后按“查找”,您可以自己找到它们来修复它,也可以使用“替换”功能。

另一种方法(给定有限的测试数据量)

@ECHO关闭
SETLOCAL ENABLEDELAYEDEXPANSION
rem源目录、目标目录、目标目录的以下设置,
rem批处理目录、文件名、输出文件名和临时文件名[如果显示]是名称
我用于测试的rem,故意包含包含空格的名称,以确保
rem确认流程使用这些名称工作。这些将需要改变,以适应您的情况。
设置“sourcedir=u:\your files”
设置“destdir=u:\your results”
设置“filename1=%sourcedir%\q66497185.txt”
设置“outfile=%destdir%\outfile.txt”
(
对于/f“usebackqdelims=“%%b IN”(“%filename1%”)DO(
%%b中的rem行
对于/F“tokens=2delims=:,”%%e IN(“%%b”)DO(
设置“图标=%%~e”
回声!图标:~0,-5!
)
)
)>“%outfile%”
后藤:EOF
设置部分是我经常使用的模板。调整以适应你自己

将文件行读取到
%%b
。并通过选择第一个
和随后的
%%e之间的部分来提取引用的名称

将标准变量的值设置为
%%e
,使用
~
修饰符删除引号


然后通过
echo
ing除变量的最后5个字符外的所有字符输出所需名称。

可以使用以下批处理文件对文件中的JSON数据执行数据提取任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
(for /F "usebackq tokens=2 delims=:," %%I in ("asset_database_Release.txt") do (
    set "Value=%%~I"
    setlocal EnableDelayedExpansion
    echo !Value:_icon=!
    endlocal
))>"asset_database_Release_ready.txt"
endlocal
还可以在单个命令行中编写所有代码,并使用命令扩展(启用)和延迟环境变量扩展(禁用)的默认值:

带有选项
/F
的命令FOR处理当前目录中文件
asset\u database\u Release.txt
中的行,从而FOR忽略空行

默认情况下,使用普通空格和水平制表符作为字符串分隔符,将从文件中读取的行拆分为子字符串(标记)。分隔符列表用“
delims=:,
修改为冒号和逗号,表示类似

{"code":"The_Great_Place_icon","type":"8","version":"80"},"
分成

  • {“code”
  • “伟大的地方”图标“
  • “类型”
  • “8”
  • “版本”
  • “80”}
  • 如果由于
    ,第一个子字符串以分号开头,
    是默认的行尾字符,则下一步将由计算;如果是这种情况,则忽略该行。文件中JSON格式的数据行不以分号开头,因此可以为该任务保留隐式默认的
    eol=;

    默认情况下,只会将第一个子字符串分配给指定的循环变量
    I
    。此处不需要此行为。第二个子字符串很重要,这是使用选项
    tokens=2
    的原因

    选项
    usebackq
    用于获取包含在双引号中的文件名,该文件名不解释为要拆分为子字符串的字符串,而是解释为应为处理哪些行的文件名

    第二个子字符串被分配到环境变量
    旁边,并删除周围的双引号

    然后使用命令
    setlocal EnableDelayedExpansion
    启用,该命令在后台执行以下操作:

  • 将当前目录路径推送到堆栈上
  • 推送堆栈上命令扩展的当前状态
  • 推送堆栈上延迟扩展的当前状态
  • 将指针推送到堆栈上的当前环境变量列表
  • 复制当前环境变量列表,以便在新的本地环境中使用
  • 根据使用的选项启用延迟扩展
  • 下一个命令需要延迟环境变量扩展,以将所有出现的
    \u图标
    替换为空字符串,这意味着从分配给环境变量
    的字符串中删除所有出现的
    \u图标
    ,并输出希望不是空的剩余字符串y字符串,这将导致输出命令回显模式的当前状态

    接下来执行命令
    endlocal
    ,以避免堆栈溢出。它在后台执行以下操作:

  • 放弃当前的环境变量列表
  • 从堆栈中弹出指向上一个环境变量列表的指针,并使用它重新激活此列表
  • 从堆栈中弹出延迟扩展的先前状态,并相应地设置延迟扩展状态
  • 从堆栈中弹出命令扩展的先前状态,并相应地设置命令扩展状态
  • 从堆栈中弹出上一个当前目录路径,如果该目录仍然存在,则再次将该目录设置为当前目录
  • 要处理STDOUTFOR循环中的ECHO命令输出的所有内容都由Windows命令处理器
    cmd.exe重新定向