Windows 由于使用单连字符,基于文件名批量重命名文件并将其移动到文件夹时出错

Windows 由于使用单连字符,基于文件名批量重命名文件并将其移动到文件夹时出错,windows,batch-file,batch-rename,Windows,Batch File,Batch Rename,我有几个文件要重命名,并根据文件名移动到各自的文件夹中。我的文件格式如下: village--rural--rodriguez.txt city--rural--santa-ana.txt city--urban--san-diego.txt city--no-data--san-marino.txt 我希望最终的输出是: village(文件夹)包含rural(子文件夹)包含rodriguez.txt city(文件夹)包含rural(子文件夹)包含santa ana.txt city(文件

我有几个文件要重命名,并根据文件名移动到各自的文件夹中。我的文件格式如下:

village--rural--rodriguez.txt
city--rural--santa-ana.txt
city--urban--san-diego.txt
city--no-data--san-marino.txt
我希望最终的输出是:

village
(文件夹)包含
rural
(子文件夹)包含
rodriguez.txt

city
(文件夹)包含
rural
(子文件夹)包含
santa ana.txt

city
(文件夹)包含
urban
(子文件夹)包含
sandiego.txt

city
(文件夹)包含
无数据
(子文件夹)包含
圣马力诺.txt

我阅读了其他类似的问题,并尝试了适用于大多数文件的方法。唯一的问题是,我的一些文件名中有单连字符
-
(如
城市中的
无数据--no data--san marino.txt
),这使得批处理文件忽略了对这些文件的处理:

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\Users\Documents"
PUSHD %sourcedir%
FOR /f "tokens=1,2*delims=-" %%a IN (
 'dir /b /a-d *--*--*.*'
 ) DO if "%%c" neq "" if exist "%%a--%%b--%%c" (  
 MD "%%a" 2>nul
 MD "%%a\%%b" 2>nul
 ren  "%%a--%%b--%%c" "%%c"
 MOVE "%%c" ".\%%a\%%b\" >nul
)
POPD
GOTO :EOF

如何使批处理文件处理文件名,无论是否使用连字符?

如果您认为此选项更适合您,可以使用此选项:

@Echo关闭
SetLocal EnableDelayedExpansion
设置“SourceDir=%UserProfile%\Documents”
CD/D“%SourceDir%”2>Nul | |退出/B
设置“i=0”
对于(*-*-*.*)中的%%A,请调用:子“%%A”
退出/B
:Sub
设置“\=%~1”
设置“i=1”
设置“33; i!=%33;:-=”&Set/A i+=1&Set“33; i!=%”
如果不存在“%\u 1%\%\u 2%\”MD“%\u 1%\%\u 2%”
移动/Y%1“%\u 1%\%\u 2%\%\u 3%>Nul

如果您认为此选项更适合您,您可以使用此选项:

@Echo关闭
SetLocal EnableDelayedExpansion
设置“SourceDir=%UserProfile%\Documents”
CD/D“%SourceDir%”2>Nul | |退出/B
设置“i=0”
对于(*-*-*.*)中的%%A,请调用:子“%%A”
退出/B
:Sub
设置“\=%~1”
设置“i=1”
设置“33; i!=%33;:-=”&Set/A i+=1&Set“33; i!=%”
如果不存在“%\u 1%\%\u 2%\”MD“%\u 1%\%\u 2%”
移动/Y%1“%\u 1%\%\u 2%\%\u 3%>Nul

无法重现该问题。它在我的电脑上运行正常。我建议你先移动,然后再移动。以防万一,源目录中已经有一个
%%c
文件。@DodgyCodeException:我编辑了详细信息。请查收。问题是文件名中包含“无数据”字符串的文件会被忽略(因为连字符)。请先将文件名放入变量中。因此,您的第一个
FOR
命令将用于获取文件名列表。解析文件名时,使用
SET
命令对双连字符进行字符串替换。将双连字符更改为文件名中没有的另一个分隔符。然后,您可以将更改后的文件名传递到
FOR/F
命令中,以基于新分隔符拆分文件名。
MD“%%a”2>不需要nul
,因为命令MD会在默认情况下启用命令扩展时创建整个目录树,并且此批处理代码需要nul,否则将不支持选项
/F
。而且不需要先删除文件,然后再移动它。命令MOVE可以将文件X移动到另一个新名称为Y的目录。因此
MOVE“%%a--%%b--%%c”“%%a\%%b\%%c”>nul
MOVE/Y“%%a--%%b--%%c”“%%a\%%b\%%c”>nul
足以覆盖目标目录中具有相同名称的现有文件。在命令提示窗口中运行
md/?
move/?
以获取帮助。无法重现该问题。它在我的电脑上运行正常。我建议你先移动,然后再移动。以防万一,源目录中已经有一个
%%c
文件。@DodgyCodeException:我编辑了详细信息。请查收。问题是文件名中包含“无数据”字符串的文件会被忽略(因为连字符)。请先将文件名放入变量中。因此,您的第一个
FOR
命令将用于获取文件名列表。解析文件名时,使用
SET
命令对双连字符进行字符串替换。将双连字符更改为文件名中没有的另一个分隔符。然后,您可以将更改后的文件名传递到
FOR/F
命令中,以基于新分隔符拆分文件名。
MD“%%a”2>不需要nul
,因为命令MD会在默认情况下启用命令扩展时创建整个目录树,并且此批处理代码需要nul,否则将不支持选项
/F
。而且不需要先删除文件,然后再移动它。命令MOVE可以将文件X移动到另一个新名称为Y的目录。因此
MOVE“%%a--%%b--%%c”“%%a\%%b\%%c”>nul
MOVE/Y“%%a--%%b--%%c”“%%a\%%b\%%c”>nul
足以覆盖目标目录中具有相同名称的现有文件。在命令提示窗口中运行
md/?
move/?
以获取帮助。这是如何工作的?特别是
Set“33; i!=%\u33;:-=”&Set/A i+=1&Set“33; i!=%”
看起来很复杂。这并不复杂,他们只需要复制和粘贴它!但是,有关其工作原理的更多信息,请参阅。它是如何工作的?特别是
Set“33; i!=%\u33;:-=”&Set/A i+=1&Set“33; i!=%”
看起来很复杂。这并不复杂,他们只需要复制和粘贴它!但是,有关其工作原理的更多信息,请参阅。