【问题标题】:Using variables in a for loop在 for 循环中使用变量
【发布时间】:2022-01-15 13:23:50
【问题描述】:

我了解setlocal enabledelayedexpansion 的魔力;这让我更进一步,但我仍然不完全高兴。我现在可以将文件名分配给!loop variable!,但我无法在随后使用该变量。我尝试获取没有扩展名的文件名。一定还有其他我不知道的事情。

这是我现在的编码:

::process all files in directory
setlocal enabledelayedexpansion

for %%f in (C:\windows\*.ico) do (

    echo F=%%f
    set myname=%%f
    echo.N=!myname!
    call :strlen myLen "!myname!"
    echo.myLen=!myLen!

    set /A L=myLen-3 + 1
    set str=!myname!
    echo.str1=!str! L=!L!
    set str=!str:~0,!L! !    <-Remove extension from filename
    echo.str2=!str!          <-This does not work!

)

这是我调用的输出:

 F=C:\windows\AnyWeb Print.ico
 N=C:\windows\AnyWeb Print.ico
 Strlen C:\windows\AnyWeb Print.ico
 myLen=25
 str1=C:\windows\AnyWeb Print.ico L=23
 str2=L       <--- what went wrong ????

【问题讨论】:

  • 老实说,学习 powershell。然后你就不必继续做我喜欢称之为 cmd 体操的事情,绞尽脑汁试图让一种基本缺乏的语言适应你的需要:-)
  • 为什么不使用for 元变量的~-modifiers,例如%%~Nf 获取基本名称,%%~Xf 获取扩展名? N. B.: The Windows command prompt is NOT a DOS prompt!

标签: windows batch-file cmd


【解决方案1】:

问题是线

set str=!str:~0,!L! !    <-Remove extension from filename

感叹号从左到右使用,你得到两个部分

set str=!str:~0,!L! !

这可以通过使用不同形式的扩展来解决,比如 FOR-loop-parameter,比如

for %%X in (!L!) DO set str=!str:~0,%%X!

但在您的情况下,存在一个更简单的解决方案

for %%C in (C:\windows\*.ico) do (

  set myname=%%C
  set name_without_extension=%%~nC
  echo Name=!myname!
  echo Only Name=!name_without_extension!
)

【讨论】:

    【解决方案2】:

    一般情况下,

    CALL set str=%%str:~0,!L!%%
    

    这将执行一个子shell,其中执行命令set str=%str:~0,{the value of L}%

    但请注意,并非所有文件名都有 3 个字符的扩展名; for 修饰符是该应用程序的更好选择。此方法是通用的get the first L characters of a string,其中需要L 的瞬时值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-19
      • 2015-11-25
      • 2020-04-05
      • 2019-09-27
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      相关资源
      最近更新 更多