批量删除变量中的空格

时间:2013-04-29 10:26:07

标签: variables batch-file spaces

我正在编写一个文件来从文件夹中的文件名中删除空格,然后将结果放在.txt文件中。我刚收到“Echo is on”的结果。一遍又一遍。

这是我到目前为止所做的:

@echo ON
SET LOCAL EnableDelayedExpansion
For %%# in (*.*) do (
    SET var=%%~n#
    Set MyVar=%var%
    set MyVar=%MyVar: =%
    echo %MyVar%>>text.txt
)

有人能告诉我什么错了吗?

4 个答案:

答案 0 :(得分:33)

删除所有空格(不仅仅是前导和尾随)可以在不使用setlocal enabledelayedexpansion的情况下完成以下行:

set var=%var: =%

这可以通过用空字符串替换字符串中的所有空格来实现。

来源:DOS - String Manipulation

答案 1 :(得分:8)

您获得ECHO is on.的原因是因为未使用延迟扩展,导致在%var%命令之前插入%MyVar%for的值运行,因为它们没有在开始时定义,所以插入了空变量。当echo %MyVar%>>text.txt运行时,它被解释为echo >>text.txt。当没有任何参数运行echo时,它会输出echo是打开还是关闭,这是你在text.txt中得到的。

要解决问题,您必须做两件事:

首先,你的第二行有问题。 setlocal中的集合和本地之间没有空格。第二行应为SETLOCAL EnableDelayedExpansion

其次,要使用延迟展开,您必须将每个变量中的所有%替换为!,例如!var!而不是%var%

最终结果:

@echo ON
SETLOCAL EnableDelayedExpansion
For %%# in (*.*) do (
    SET var=%%~n#
    Set MyVar=!var!
    set MyVar=!MyVar: =!
    echo !MyVar!>>text.txt
)

在这种情况下,您实际上不需要使用临时变量,只需执行SET MyVar=%%~n#并跳至set MyVar=!MyVar: =!

答案 2 :(得分:1)

错误的是你已经启用了变量扩展(你把它弄糟了......)并且你没有使用它,当你使用enabledelayedexpansion时你需要写变量名称:!变量!而不是其他:%变量%

但您不需要将此代码用于此代码:

@echo ON
For %%# in (*) do (
    SET "var=%%~n#"
    Call Set "MyVar=%%var: =%%"
    Call echo %%MyVar%%>>text.txt
)

答案 3 :(得分:0)

在包含要重命名的文件的文件夹中运行以下批处理

    @echo off
    setlocal enabledelayedexpansion
    for %%j in (*.*) do (
    set filename=%%~nj
    set filename=!filename=.=_!
    set filename=!filename= =_!
    if not "!filename!"=="%%~nj" ren "%%j" "!filename!%%~xj"
    )

你只需要将打印添加到txt