【问题标题】:Why does substring in for not work?为什么 substring in for 不起作用?
【发布时间】:2012-02-11 01:39:28
【问题描述】:

使用这个批处理文件我想压缩一些 *.txt 文件。每个 *.txt 文件都在其自己的 zip 文件中。不幸的是它不起作用,我得到了输出

ECHO is disabled (OFF).

好几次。这是源代码:

@echo off
setlocal EnableDelayedExpansion

for %%i in (*.txt) do (
    set filename = %%i
    set filenametrunc = %filename:~0,10%

    7z a -tzip -mx0 %zipname%
    echo %filename% zipped.
)

我阅读了一些关于 EnableDelayedExpansion 的内容并激活了它。但无法让它工作。

任何帮助表示赞赏。

【问题讨论】:

  • 错误:“set a = %%i” 正确:“set a=%%i”(= 周围不能有空格)

标签: loops batch-file for-loop substring


【解决方案1】:

仅当您需要访问在循环内分配的变量时,才需要在循环内进行延迟扩展。但在你的情况下没有必要。

您首先需要获得正确的 7z 语法。您的原始代码试图将当前目录中的所有文件放入一个 zip 文件中,因为您没有指定文件名。您的 ZIPNAME 也未初始化。你想要类似下面的东西。

7z a -tzip zipname filename

我假设您希望 zip 的名称与原始文件名相同,除了使用 .zip 前缀而不是 .txt。那么你需要的只是 ~n 修饰符,它给出了没有前缀的基本名称。 7-Zip 会自动附加 .zip 扩展名。

for %%i in (*.txt) do 7z a -tzip %%~ni %%i

如果您愿意,可以添加 -mx0 选项,该选项不进行压缩。我无法想象你为什么要为文本文件这样做。

for %%i in (*.txt) do 7z a -mx0 -tzip %%~ni %%i

如果您想添加自己的消息

for %%i in (*.txt) do (
  7z a -mx0 -tzip %%~ni %%i
  echo %%i zipped into %%~ni.zip
)

【讨论】:

    【解决方案2】:

    您需要使用SetLocal EnableDelayedExpansion 并将变量包装在! 中。另外,不要在变量名、等号和值之间放置空格。

    set filename = ... 生成一个名为%filename % 的变量,其值为 ...
    set filename=..... 生成一个名为%filename% 的变量,其值为.....

    @echo off
    setlocal EnableDelayedExpansion
    
    for %%i in (*.txt) do (
        set filename=%%i
        set filenametrunc=!filename:~0,10!
    
        7z a -tzip -mx0 !zipname!
        echo !filename! zipped.
    )
    

    括号内% 中的变量会同时计算,也就是在整个循环开始执行之前。您之前的代码会在 set 语句运行之前展开所有变量。

    【讨论】:

      【解决方案3】:

      您需要初始化变量 zipname 并使用 ! 字符而不是 % 字符扩展 var。

      阅读HELP SET,具体

      延迟的环境变量扩展允许您使用不同的 字符(感叹号)来扩展环境变量 执行时间处理时间。

      并将您的代码更改为

      @echo off
      setlocal EnableDelayedExpansion
      for %%i in (*.txt) do (
          set zipname=%%i
          7z a -tzip -mx0 !zipname!
          echo !zipname! zipped.
      ) 
      

      【讨论】:

        猜你喜欢
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        相关资源
        最近更新 更多