为什么子串不起作用?

时间:2012-01-16 00:03:04

标签: loops batch-file for-loop substring

使用这个批处理文件我想要压缩一些* .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的内容并将其激活。虽然无法让它发挥作用。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:6)

您需要使用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语句运行之前扩展所有变量。

答案 1 :(得分:4)

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

阅读HELP SET,特别是

  

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

并将您的代码更改为

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

答案 2 :(得分:3)

如果需要访问在循环内分配的变量,则只需在循环内进行延迟扩展。但在你的情况下没有必要。

您需要先获得正确的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
)