Windows 使用批处理从行中提取字符串

Windows 使用批处理从行中提取字符串,windows,batch-file,cmd,delimiter,Windows,Batch File,Cmd,Delimiter,我有以下方式的数据: adb.hghgjjk.hkdhdl.Connhhhjj=hjkld\:hjkld\:thin\:hjdkdl\:3000\:abcdefg 我想使用批处理从上面的行中提取abcdefg 上面的数据可能会发生变化,所以我们需要从行尾到背面读取,并停在:冒号分隔符附近并提取它 有什么建议吗?通常,如果用户不尝试编写一些代码并投入一些精力研究问题,我们不会发布代码。这背后的简单哲学是教人钓鱼,而不是给人鱼 试试这个 @echo off set "string=adb.hghg

我有以下方式的数据:

adb.hghgjjk.hkdhdl.Connhhhjj=hjkld\:hjkld\:thin\:hjdkdl\:3000\:abcdefg
我想使用批处理从上面的行中提取abcdefg

上面的数据可能会发生变化,所以我们需要从行尾到背面读取,并停在:冒号分隔符附近并提取它


有什么建议吗?

通常,如果用户不尝试编写一些代码并投入一些精力研究问题,我们不会发布代码。这背后的简单哲学是教人钓鱼,而不是给人鱼

试试这个

@echo off
set "string=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld:hjkld:thin:hjdkdl:3000:abcdefg"
set "first=%string::=" & set "last=%"
echo %last%
pause
如果您的数据永远不会有需要保留的分号,您也可以这样做

@echo off
set "string=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld:hjkld:thin:hjdkdl:3000:abcdefg"
set "string=%string::=;%"
FOR %%G IN (%string%) do set "last=%%G"
echo %last%
pause
还有一个很好的例子。批处理文件的好处是,很多时候,剥猫皮的方法不止一种

@echo off
set "string=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld:hjkld:thin:hjdkdl:3000:abcdefg"
:loop
FOR /F "tokens=1* delims=:" %%G IN ("%string%") do (
    set "last=%%G"
    IF NOT "%%~H"=="" (
        SET "string=%%~H"
        GOTO loop
    )
)
echo %last%
pause

通常情况下,如果用户没有尝试编写一些代码并投入一些精力研究问题,我们不会发布代码。这背后的简单哲学是教人钓鱼,而不是给人鱼

试试这个

@echo off
set "string=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld:hjkld:thin:hjdkdl:3000:abcdefg"
set "first=%string::=" & set "last=%"
echo %last%
pause
如果您的数据永远不会有需要保留的分号,您也可以这样做

@echo off
set "string=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld:hjkld:thin:hjdkdl:3000:abcdefg"
set "string=%string::=;%"
FOR %%G IN (%string%) do set "last=%%G"
echo %last%
pause
还有一个很好的例子。批处理文件的好处是,很多时候,剥猫皮的方法不止一种

@echo off
set "string=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld:hjkld:thin:hjdkdl:3000:abcdefg"
:loop
FOR /F "tokens=1* delims=:" %%G IN ("%string%") do (
    set "last=%%G"
    IF NOT "%%~H"=="" (
        SET "string=%%~H"
        GOTO loop
    )
)
echo %last%
pause

PowerShell可以使用正则表达式。结果被放入R变量中。如果没有匹配项,R将一文不值

@ECHO OFF
SET "S=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld\:hjkld\:thin\:hjdkdl\:3000\:abcdefg"
SET "R="
FOR /F %%a IN ('powershell -NoLogo -NoProfile -Command ^
    " '%S%' | Where-Object { $_ -match '.*:(.*$)' } | ForEach-Object { $Matches[1] } "') DO (SET "R=%%a")
ECHO R is %R%

PowerShell可以使用正则表达式。结果被放入R变量中。如果没有匹配项,R将一文不值

@ECHO OFF
SET "S=adb.hghgjjk.hkdhdl.Connhhhjj=hjkld\:hjkld\:thin\:hjdkdl\:3000\:abcdefg"
SET "R="
FOR /F %%a IN ('powershell -NoLogo -NoProfile -Command ^
    " '%S%' | Where-Object { $_ -match '.*:(.*$)' } | ForEach-Object { $Matches[1] } "') DO (SET "R=%%a")
ECHO R is %R%


我发现了一个类似的问题,以防对您有所帮助。我认为这对我不起作用,因为他们已经硬编码了这些值。对我来说,abcdefg可以是任何长度。所以我需要从后面开始,在冒号附近停下来,然后提取它。数据是从文件中检索的还是一个变量?如果是从文件中检索,它是文件中唯一的一行吗?文件的第一行吗?文件的最后一行?和/或您使用什么方法来解析文件以隔离特定数据段?@Compo,变量中存在数据您是如何首先将数据放入变量的。我这样问是因为这种方法可能会得到改进,以获得您所需要的信息,而不必以后再这样做。您是否可以提供脚本中将数据输出到变量的适当部分,以便将任何答案更好地集成到您的it中。我发现了一个类似的问题,以防它对您有所帮助。我认为这对我不起作用,因为他们已经硬编码了这些值。对我来说,abcdefg可以是任何长度。所以我需要从后面开始,在冒号附近停下来,然后提取它。数据是从文件中检索的还是一个变量?如果是从文件中检索,它是文件中唯一的一行吗?文件的第一行吗?文件的最后一行?和/或您使用什么方法来解析文件以隔离特定数据段?@Compo,变量中存在数据您是如何首先将数据放入变量的。我这样问是因为这种方法可能会得到改进,以获得您所需要的信息,而不必以后再这样做。您是否可以提供脚本中将数据输出到变量的适当部分,以便将任何答案更好地集成到您的it中。以下是adb.hghgjjjk.hkdhdl.connhhjj=hjkld \:hjkld \:thin \:hjdkdl \:3000 \:abcdefg do SET extractedsid=%%z中/f令牌的代码SETLOCAL enableddelayedexpansion=:%%z ECHO!提拔希德!请您解释或提供您上面显示的每个代码的信息@壁球收集+1@prudhvikrishna在第一个代码示例中,变量first get在every:之后分配的变量字符串内容替换为&set last=这是一种自修改代码。行set first=%string::=&set last=%是一个真正的kick。你能说得更多一些吗?或者找个地方读一读吗?@lit,这项技术是在上世纪90年代发现的。你甚至可以用这种技术构建伪数组。我已经尝试过这个@squashman。以下是adb.hghgjjjk.hkdhdl.connhhjj=hjkld \:hjkld \:thin \:hjdkdl \:3000 \:abcdefg do SET extractedsid=%%z中/f令牌的代码SETLOCAL enableddelayedexpansion=:%%z ECHO!提拔希德!请您解释或提供您上面显示的每个代码的信息@壁球收集+1@prudhvikrishna在第一个代码示例中,变量first get在every:之后分配的变量字符串内容替换为&set last=这是一种自修改代码。行set first=%string::=&set last=%是一个真正的kick。你能说得更多一些吗?或者找个地方读一读吗?@lit,这项技术是在上世纪90年代发现的。您甚至可以使用此技术构建伪数组。