Batch file 循环的CMD代码,用于排列文件名(如果else Contain语句)

Batch file 循环的CMD代码,用于排列文件名(如果else Contain语句),batch-file,if-statement,Batch File,If Statement,这是我在CMD批处理中的函数。目的是根据不同的名称对9个文件夹进行分类,例如,如果名称包含109,则文件将排列到文件夹109。然而,我在这里只能为循环写9 (文件夹名称为使用电话号码101-109,文件格式为date-phone1-phone2--记录id。) 某些记录id将重复,因为狩猎线设置) 但那是行不通的。如果%%I在(-101-)中,我也会尝试,但也没有工作。有没有一种更简单的方法来编写forloop,以便按顺序排序,而不是要求循环9次 setlocal set year=%date

这是我在CMD批处理中的函数。目的是根据不同的名称对9个文件夹进行分类,例如,如果名称包含109,则文件将排列到文件夹109。然而,我在这里只能为循环写9

(文件夹名称为使用电话号码101-109,文件格式为date-phone1-phone2--记录id。) 某些记录id将重复,因为狩猎线设置)

但那是行不通的。如果%%I在(-101-)中,我也会尝试,但也没有工作。有没有一种更简单的方法来编写forloop,以便按顺序排序,而不是要求循环9次

setlocal

set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%

cd C:\Users\SQ\Desktop\MWRecord
IF EXIST %year% (cd %year%) ELSE (mkdir %year% & cd %year%)
IF EXIST %year%%month% (cd %year%%month%) ELSE (mkdir %year%%month% & cd %year%%month%)
IF EXIST %year%%month%%day% (cd %year%%month%%day%) ELSE (cd ..\.. & move %year%%month%%day% %year%\%year%%month% & cd %year%\%year%%month%\%year%%month%%day%)

for /r %%i in (*-101-*) do ( IF EXIST 101 (move %%i 101) ELSE (mkdir 101 & move %%i 101))
for /r %%i in (*-102-*) do ( IF EXIST 102 (move %%i 102) ELSE (mkdir 102 & move %%i 102))
for /r %%i in (*-103-*) do ( IF EXIST 103 (move %%i 103) ELSE (mkdir 103 & move %%i 103))
for /r %%i in (*-104-*) do ( IF EXIST 104 (move %%i 104) ELSE (mkdir 104 & move %%i 104))
for /r %%i in (*-105-*) do ( IF EXIST 105 (move %%i 105) ELSE (mkdir 105 & move %%i 105))
for /r %%i in (*-106-*) do ( IF EXIST 106 (move %%i 106) ELSE (mkdir 106 & move %%i 106))
for /r %%i in (*-107-*) do ( IF EXIST 107 (move %%i 107) ELSE (mkdir 107 & move %%i 107))
for /r %%i in (*-108-*) do ( IF EXIST 108 (move %%i 108) ELSE (mkdir 108 & move %%i 108))
for /r %%i in (*-109-*) do ( IF EXIST 109 (move %%i 109) ELSE (mkdir 109 & move %%i 109))

endlocal

如果您有一个完整的要搜索的数字列表(似乎是这样),如果是这样的话,那么这可能会有所帮助。它不会移动文件,而是会复制文件,因此如果您正在查找
104
,它会将文件复制到文件夹
104
,如果您按照列表中的第二个示例搜索这两个数字,当
104
109
时,它会将文件复制到两个文件夹
104
109
中,然后您只需在两个循环后执行
del*.wav

@echo off
set "list=101 102 103 104 105 106 107 108"
for %%i in (%list%) do (
  for /F %%a in ('dir /b /a-d "*-%%i-*"') do (
      mkdir %%i
      copy "%%a" %%i
    )
)

如果你有一个完整的数字列表(似乎是这样的),你想搜索,如果是这样的话,那么这可能会有所帮助。它不会移动文件,而是会复制文件,因此如果您正在查找
104
,它会将文件复制到文件夹
104
,如果您按照列表中的第二个示例搜索这两个数字,当
104
109
时,它会将文件复制到两个文件夹
104
109
中,然后您只需在两个循环后执行
del*.wav

@echo off
set "list=101 102 103 104 105 106 107 108"
for %%i in (%list%) do (
  for /F %%a in ('dir /b /a-d "*-%%i-*"') do (
      mkdir %%i
      copy "%%a" %%i
    )
)

您可以按如下方式执行此操作:

@echo关闭
对于(101 1 109)do中的/L%%A(
对于/F“delims=eol=“%%B IN('dir/S/B/A-D“*-%%A-*”)do(
md“%%A”2>nul
移动“%%~fB”“%%A”
)
)
但是,如果一个文件同时包含
101
102
,并且您希望将其移动到
102
文件夹中,则这将无法完全起作用

因此,我推荐以下非常复杂的代码:

@echo关闭
setlocal EnableDelayedExpansion
对于/F“delims=eol=“%%A IN('dir/S/B/A-D“*%%A*”)do(
设置“fname=%%~nA”
设置“全部=!fname:-->random-!”
rem以下代码适用于第一部手机:
对于/F“tokens=2 delims=-”%%C IN(“!all!”)do(
md“%%B”
移动“%%~fA”“%%~dpA%%~nxB”
)
)

如果您想要第二部手机,请将
tokens=2
替换为
tokens=3

您可以按如下操作:

@echo关闭
对于(101 1 109)do中的/L%%A(
对于/F“delims=eol=“%%B IN('dir/S/B/A-D“*-%%A-*”)do(
md“%%A”2>nul
移动“%%~fB”“%%A”
)
)
但是,如果一个文件同时包含
101
102
,并且您希望将其移动到
102
文件夹中,则这将无法完全起作用

因此,我推荐以下非常复杂的代码:

@echo关闭
setlocal EnableDelayedExpansion
对于/F“delims=eol=“%%A IN('dir/S/B/A-D“*%%A*”)do(
设置“fname=%%~nA”
设置“全部=!fname:-->random-!”
rem以下代码适用于第一部手机:
对于/F“tokens=2 delims=-”%%C IN(“!all!”)do(
md“%%B”
移动“%%~fA”“%%~dpA%%~nxB”
)
)

如果您想要第二部手机,请将
tokens=2
替换为
tokens=3

在图片中的第二个文件中,它同时包含
-109-
-104-
,那么您会将其移动到哪个文件夹?如果一个文件同时包含这两个号码,您预计会发生什么?请参见屏幕截图中的示例2和示例6?另外,
.wav
之前的最后几位数字是否始终是3位数字?这是语音记录,这些3位数字104是我自己的号码,需要安排到以下号码文件夹,如果自己的号码像示例2一样呼叫,考虑使用shorter-than-XXX语句将记录放在其他文件夹中,但如果调用未知号码,记录也会变短,此问题仍在考虑解决方案。因此,您的意思是,您实际使用的号码是
*-109--nnn.wav
?在图片中,第二个文件,它既有
-109-
又有
-104-
,那么您会将其移动到哪个文件夹?当一个文件同时有两个编号时,您希望发生什么?请参见屏幕截图中的示例2和示例6?另外,
.wav
之前的最后几位数字是否始终是3位数字?这是语音记录,这些3位数字104是我自己的号码,需要安排到以下号码文件夹,如果自己的号码像示例2一样呼叫,考虑使用shorter-than-XXX语句将记录放在其他文件夹中,但如果调用了未知号码,则记录也会变短,此问题仍在考虑解决方案。因此,您是说您实际使用的号码是
*-109--nnn.wav
?我可能看得不正确,但是,如果文件名包含
-102-
-109-
,例如
6
,那么肯定会使
\102\
,将文件复制到其中,然后从源代码中删除它。由于它已被删除,现在无法对其进行分析以复制到
\109\
。您的复制和删除序列具有与
移动
完全相同的功能!我可能没有正确地看待这个问题,但如果文件名包含
-102-
-109-
,例如
6
,这将使
\102\
,将文件复制到其中,然后从源代码中删除它。由于它已被删除,现在无法对其进行分析以复制到
\109\
。您的复制和删除序列具有与
移动
完全相同的功能!非常感谢,我尝试了这种方式,它是有效的,但是,我仍然认为让for循环的方式将决定什么