如何在批处理文件中进行计算以获取指定的字符

时间:2014-07-10 05:29:00

标签: batch-file

如何获取所选角色

for %%A in (controls\vbalSGrid6.ocx) do (
    SET TEXT=%A%
    SET SUBSTRING=%TEXT:~9%
    echo %SUBSTRING%
)

这是关闭回声但我只需要vbalsgrid6.ocx

1 个答案:

答案 0 :(得分:2)

直接的方式

set "text=controls\vbalscrid6.ocx"
set "substring=%text:~9%"

不需要for命令,除非您正在迭代一组文件或者您不想使用子字符串操作来获取文件名

简单方法获取文件的名称和扩展名

for %%a in (controls\vbalsgrid6.ocx) do set "fileName=%%~nxa"

%%a保留对文件的引用,%%~nxa是引用文件的文件名和扩展名

您的代码的直接翻译/更正版本(在这种情况下,迭代文件列表,但不需要)

@echo off

setlocal enableextensions enabledelayedexpansion

for %%a in (controls\*.ocx) do (
    set "text=%%a"
    set "substring=!text:~9!"
    echo !substring!
)

当批处理解析器到达代码行/代码块(括号内的代码)时,将检查整行/块,搜索将引用变量的位置。所有这些读取都将替换为在解析时存储在变量中的值,执行行/块之前。这意味着如果变量在块内更改其值,则无法从同一块内部访问此更改的值,因为变量的读取操作先前已替换为存储在其中的初始值。

要处理这种情况,请使用延迟扩展。启用延迟扩展后,可以更改(在需要时)语法以读取变量,从%var%!var!,指示解析器应该延迟此读取操作,直到命令为止执行。

包含的代码可以在文件名中没有!的情况下使用。由于延迟扩展处于活动状态,解析器将尝试解释任何!,在某些情况下会给出非预期的结果。它可以处理,但有时它可能有点棘手。

@echo off

    setlocal enableextensions disabledelayedexpansion

    for %%a in (controls\*.ocx) do (
        rem Retrieve the initial text. No problem as delayed expansion is disabled
        set "text=%%a"

        rem Enable delayed expansion to read the value in %text%. And ensure  
        rem it is disabled at the moment of the assignment to the substring var
        setlocal enabledelayedexpansion
        set "substring="
        for /f "delims=" %%b in ("!text:~9!") do (endlocal & set "substring=%%b")

        rem We need delayed expansion enabled to read the changed value 
        rem If substring is empty, the previous endlocal was not executed and 
        rem there is no need for a new setlocal
        if defined substring setlocal enabledelayedexpansion
        echo(substring value=!substring!
        endlocal
    )