如何获取所选角色
for %%A in (controls\vbalSGrid6.ocx) do (
SET TEXT=%A%
SET SUBSTRING=%TEXT:~9%
echo %SUBSTRING%
)
这是关闭回声但我只需要vbalsgrid6.ocx
。
答案 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
)