1

我无法理解 DOS 批处理文件的变量替换机制,尤其是在 for 循环中。

简化批处理问题:想象如下目录
01foo.txt
02foo.dir(这是一个目录)
bar01(这是一个目录)
bar02(这是一个目录)

我想将此目录中不以“bar”开头的所有文件/目录移动到 bar+_the_first_2_characters_of_the_filename_or_directory_name 的子目录。
在这种情况下,01foo.txt 将被移动到 bar01,02foo.dir 将被移动到 bar02。

以下脚本是我的第一次尝试:

setlocal EnableDelayedExpansion  
for %%A in (*) do (  
    set _x=%%A
    if (!_x:~0,2! NEQ "bar") move %%A bar!_x:~0,2!
)
endlocal

除了这似乎只针对文件循环之外,它根本不起作用:-)。我在 if 语句中收到一个错误,说“3!此时出乎意料”

关于如何改善情况/脚本的任何想法?

谢谢

4

1 回答 1

2

只是语法的问题...

IF语句不期望不接受周围的括号。
中的逗号!_x:~0,2!打破了 IF 语句,您可以引用这两个部分或将其移动到自己的set prefix=!_x:~0,2!"行中。
如果你引用"bar"你也需要引用"!prefix!"

就这样

setlocal EnableDelayedExpansion  
for %%A in (*) do (  
    set "_x=%%A"
    set "prefix=!_x:~0,2!"
    if "!prefix!" NEQ "bar" move %%A bar!prefix!
)
endlocal
于 2012-08-27T13:06:17.423 回答