我已经运行以下程序,
@echo off
cls
set /p "filename=type file name>"
setlocal enabledelayedexpansion
for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" (
echo %%~dpnxa >>path.txt
)
我有一个输出文件path.txt
,其中包含,
E:\new.txt
E:\Redmi\new folder\new.txt
E:\windows\new folder\new folder\new.txt
我喜欢把它们放在单独的文件中,比如,
E:\new.txt
在path1.txt
E:\Redmi\new folder\new.txt
在path2.txt
E:\windows\new folder\new folder\new.txt
在path3.txt
答案1
如何按行将单个文本文件分成多个文本文件?
基于以下评论塞斯,您可以使用以下批处理文件:
@echo off
cls
setlocal enabledelayedexpansion
set /p "filename=type file name>"
rem initialise counter to 1
set _count=1
for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" (
echo %%~dpnxa >>path!_count!.txt
rem increment the counter
set /a _count+=1
)
endlocal
笔记:
- 我已移动该
setlocal
行以阻止变量filename
泄漏到调用cmd
shell 中。
进一步阅读
- Windows CMD 命令行的 AZ 索引
- Windows CMD 命令的分类列表
- 启用延迟扩展- 延迟扩展将导致变量在执行时而不是在解析时扩展。
- 端局部- 结束批处理文件中环境更改的本地化。将变量从一个批处理文件传递到另一个批处理文件。
- 对于/r- 循环遍历文件(递归子文件夹)。
- 放- 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。
- 设置本地- 设置选项来控制批处理文件中环境变量的可见性。
答案2
我有一个更简单,可能更快的解决方案给你:
- 使用
DIR /S /B /A-D
而不是FOR /R
来获取路径列表。这样就无需使用语句IF
。 - 通过管道传输到
FINDSTR /N
,匹配行首,以获取用于输出文件名的行号。 - 执行其中的整个过程
FOR /F
进行迭代,并将结果解析为行号和每行的路径。
@echo off
setlocal
set /p "filename=type file name>"
for /f "delims=: tokens=1*" %%A in (
'dir /s /b /a-d "E:\%filename%" ^| findstr /n "^"'
) do >"path%%A.txt" echo %%B
如果这是我的脚本,我会将目标文件名作为参数传递而不是提示它:
@echo off
for /f "delims=: tokens=1*" %%A in (
'dir /s /b /a-d "E:\%~1" ^| findstr /n "^"'
) do >"path%%A.txt" echo %%B