用条件语句IN BATCH删除字符串中的最后一个字符

问题描述 投票:0回答:1

我有多个格式为random_Gnumbers的字符串。例如abcd_G123或32893hfj_G7890。我想从字符串中删除数字的最后一位,直到遇到G。没有固定数量的字符,也没有特殊字符。如何提取G之前和包括G的所有内容。例如,我想从32893hfj_G7890中提取32893hfj_G

batch-file
1个回答
0
投票

实现此目的的一种方法是使用Sets内置的子字符串容量,使用基于For Loop的函数来标识_G的位置。

以下示例中的函数具有一定的灵活性。它使用字符串值,返回字符串的变量名,要定位的子字符串以及目标子字符串的长度来调用。

For ideas about how to apply it to large numbers of strings visit here

@echo off
Set _S=123456789_G123567

Call :ModString %_S% _S _G 2
ECHO(%_S%
pause

:ModString REM <stringVal> <stringVar> <targetSubString> <SubstringLength>
Setlocal EnableDelayedExpansion
IF "%~1"=="" CALL :MS_Syntax 1
IF "%~2"=="" CALL :MS_Syntax 2
IF "%~3"=="" CALL :MS_Syntax 3
IF "%~4"=="" CALL :MS_Syntax 4
    IF Defined ParamError (
        pause
        exit
    )
Set "tmp=%1"

:Modloop
For /L %%a in (0,1,100) DO (
    Set tmpMod=!tmp:~%%a,%~4!
    IF "!tmpMod!"=="%~3" (
    Set tmp=!tmp:~0,%%a!%3
    GOTO :endPos
    )
)

(
ENDLOCAL
ECHO( String did Not Contain the target value.
exit /b
)

:endPos
(
ENDLOCAL & Set "%~2=%tmp%"
exit /b
)

:MS_Syntax
IF "%~1"=="1" ECHO( Paramater %1 Missing. Must contain the String value      Ie: %%VarName%%
IF "%~1"=="2" ECHO( Paramater %1 Missing. Must contain the Variable name     Ie: VarName
IF "%~1"=="3" ECHO( Paramater %1 Missing. Must contain the target Substring  Ie: _G
IF "%~1"=="4" ECHO( Paramater %1 Missing. Must contain the Substrings length Ie: 2
Set ParamError=true
exit /b
  • [Set "tmp=%1"将整个字符串的值分配给tmp变量
  • [Set tmpMod=!tmp:~%%a,%4!使用Sets Substring Modifications在for循环期间从字符串的开头开始逐渐修整,保留为Substring指定的长度。
    IF "!tmpMod!"=="%3" (
    Set tmp=!tmp:~0,%%a!%3
    GOTO :endMod
    )

检查当前修剪的字符串是否与目标子字符串匹配,然后在退出For循环之前将所需的字符串设置为tmp。

:endMod
(
ENDLOCAL & Set "%~2=%tmp%"
exit /b
)

结束本地环境并将缩短的字符串的值返回到原始变量。

© www.soinside.com 2019 - 2024. All rights reserved.