使用索引字母从文本文件创建文件夹

Mbr*_*r88 2 batch-file

我有下面的批处理脚本.它应该读取文本文件的每一行的第一个字符.这是一个到z,它应该在相应的文件夹中创建一个子文件夹.它是其他的东西,它应该在"_other"文件夹中创建.

所以如果我有一个清单:

123test
aaatest
bbbtest
Run Code Online (Sandbox Code Playgroud)

它应该创建:

c:\dirs\_other\123test
c:\dirs\a\aaatest
c:\dirs\b\bbbtest
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,我的最后一个if/else不起作用.为什么不?这是脚本:

setlocal EnableDelayedExpansion
set file=c:\klantenlijst.txt
FOR /F "delims=~" %%i IN (!file!) DO (
set var=%%i 
set str=!var:~0,1!
IF !str!==A ( set letter=1 )
IF !str!==B ( set letter=1 )
IF !str!==C ( set letter=1 )
IF !str!==D ( set letter=1 )
IF !str!==E ( set letter=1 )
IF !str!==F ( set letter=1 )
IF !str!==G ( set letter=1 )
IF !str!==H ( set letter=1 )
IF !str!==I ( set letter=1 )
IF !str!==J ( set letter=1 )
IF !str!==K ( set letter=1 )
IF !str!==L ( set letter=1 )
IF !str!==M ( set letter=1 )
IF !str!==N ( set letter=1 )
IF !str!==O ( set letter=1 )
IF !str!==P ( set letter=1 )
IF !str!==Q ( set letter=1 )
IF !str!==R ( set letter=1 )
IF !str!==S ( set letter=1 )
IF !str!==T ( set letter=1 )
IF !str!==U ( set letter=1 )
IF !str!==V ( set letter=1 )
IF !str!==W ( set letter=1 )
IF !str!==X ( set letter=1 )
IF !str!==Y ( set letter=1 )
IF !str!==Z ( set letter=1 )

IF !letter!==1 ( md c:\Dirs\!str!\!var! ) ELSE ( md c:\Dirs\_Other\!var! )

)
Run Code Online (Sandbox Code Playgroud)

Aac*_*ini 5

这是我这样做的方式:

@echo off
setlocal EnableDelayedExpansion
set letters=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set file=c:\klantenlijst.txt
FOR /F "delims=" %%i IN (%file%) DO (
   set var=%%i
   set str=!var:~0,1!
   for %%a in ("!str!") do if "!letters:%%~a=!" equ "%letters%" set str=_other
   md "c:\dirs\!str!\!var!"
)
Run Code Online (Sandbox Code Playgroud)

上面的程序试图从包含所有字母的字符串中删除第一个字符; 如果结果相同,那么第一个字符不是字母.此方法更快,因为它不使用任何外部.exe命令.

编辑:添加了一些解释

在下面的示例中,我首先编写一个命令,然后编写其输出.

letters变量包含26个字母,即:

echo !letters!
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

Batch允许以这种方式替换部分变量值:

echo !letters:M=123!
ABCDEFGHIJKL123NOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

如果没有给出替换字符串,则只删除原始子字符串:

echo !letters:M=!
ABCDEFGHIJKLNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

如果原始子字符串包含在另一个变量中,则使用其值实现替换.例如,如果变量有一个字母:

set str=M
echo !letters:%str%=!
ABCDEFGHIJKLNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

另一方面,如果变量没有字母,则新值保持与原始值相同:

set str=1
echo !letters:%str%=!
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

这样,如果你比较"!letters:%str%=!"对比"%letters%"; 如果结果是DIFFERENT,则str变量包含一个字母; 否则str变量包含非字母字符.

但是,您必须注意 FOR循环修改了str变量.这意味着它的值必须使用DelayedExpansion替换,但这导致以下有趣的代码:"!letters:!str!=!"当然,这是无效的.修复此细节的方法是!str!通过FOR可替换参数更改值,然后使用replace子字符串表达式中的参数.

您必须注意,以前的替换是由cmd.exe处理器立即实现的,因为正常处理批处理文件.另一方面,执行ECHO !str! | FINDSTR /I "[A-Z]"需要加载FINDSTR.EXE文件(大约30 KB大小)和执行CMD.EXE 的两个副本以执行管道的每一侧,并为每个名称执行此过程在列表中!.这意味着这种方法比前者得多,如果名称列表很大,则时间差异很明显.