我对批处理文件不太熟悉,所以非常感谢您的帮助。我在一个目录中存储了大量文件,我希望根据文件名中的第一个单词将它们分类到子文件夹中。因此,我有如下文件:
C:\Folder\ABC_001
C:\Folder\BCD_001
C:\Folder\CDF_002
C:\Folder\DFE_003
我希望根据第一个单词将所有文件移动到子文件夹中,最终如下所示:
C:\Folder\001\ABC_001
C:\Folder\001\BCD_001
C:\Folder\002\CDF_002
C:\Folder\003\DFE_003
这是我的代码,但它不起作用
@Echo off
PushD C:\folder
for %%A in ("*_*.*") do for /f "tokens=1* delims=-" %%B in ("%%A") do (
If not exist "%%B" MD "%%B"
Move "%%A" "%%B\"
)
PopD
答案1
我希望根据文件名中的第一个单词将文件排序到子文件夹中
for %%A in ("*_*.*") do for /f "tokens=1* delims=-" %%B in ("%%A") do (
上面的内容被破坏了,因为您将其-
作为了分隔符,而实际上应该是_
。
Move "%%A" "%%B\"
上面的内容已损坏,因为与%%A
您的文件不匹配。应该是"%%A_%%B"
使用以下批处理文件(test.cmd):
@echo off
setlocal
PushD folder
for /f "tokens=1* delims=_" %%A in ('dir /b *_*.*') do (
If not exist "%%B" MD "%%B"
Move "%%A_%%B" "%%B\"
)
PopD
endlocal
例子:
F:\test>dir /b /s folder
F:\test\folder\ABC_001
F:\test\folder\BCD_001
F:\test\folder\CDF_002
F:\test\folder\DFE_003
F:\test>test
1 file(s) moved.
1 file(s) moved.
1 file(s) moved.
1 file(s) moved.
F:\test>dir /b /s folder
F:\test\folder\001
F:\test\folder\002
F:\test\folder\003
F:\test\folder\001\ABC_001
F:\test\folder\001\BCD_001
F:\test\folder\002\CDF_002
F:\test\folder\003\DFE_003
F:\test>
进一步阅读
答案2
如果您不了解批处理脚本,并且雇主不要求您了解,那么最好学习和使用 PowerShell。虽然一开始它似乎“比较冗长”,但这是一件好事 --- 当您六个月后查看代码时,却记不起您做了什么。:D
代码如下:
Get-ChildItem -file -path 'c:\Folder' |
ForEach-Object{
$newDir = ($_.BaseName -split '_')[-1]
$NewDir = Join-Path $_.Directory $newDir
If (!( Test-Path $NewDir )) {
New-Item -Itemtype Directory -Path $newDir
}
Move-Item $_ $NewDir
}