Variables 循环中的批处理文件、变量扩展和子字符串

Variables 循环中的批处理文件、变量扩展和子字符串,variables,batch-file,substring,expansion,Variables,Batch File,Substring,Expansion,我无法理解DOS批处理文件的变量替换机制,尤其是在for循环中 简化的批处理问题:想象以下目录 01foo.txt 02foo.dir(这是一个目录) bar01(这是一个目录) bar02(这是一个目录) 我想将此目录中所有不以“bar”开头的文件/目录移动到一个子目录中,该子目录是bar+\u文件名或目录名的\u第一个\u 2个\u字符。\br> 在这种情况下,01foo.txt将被移动到bar01中,02foo.dir将被移动到bar02中 以下脚本是我的第一次尝试: setlocal E

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

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

我想将此目录中所有不以“bar”开头的文件/目录移动到一个子目录中,该子目录是bar+\u文件名或目录名的\u第一个\u 2个\u字符。\br> 在这种情况下,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!此时是意外的”

关于如何改善现状/剧本有什么想法吗


谢谢

这只是语法问题

IF
语句不接受括号。
中的逗号_x:~0,2
中断IF语句,您可以引用这两个部分或将其移动到自己的
set prefix=_x:~0,2!“
行。
如果您引用
“bar”
,您还需要引用
“!前缀“

就这些

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