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!=%”
看起来很复杂。这并不复杂,他们只需要复制和粘贴它!但是,有关其工作原理的更多信息,请参阅。