首页 > 解决方案 > 如何使用批处理文件选择性地删除文本文件中的文本?

问题描述

@ECHO OFF

if not exist "C:\test\test.txt" (
    goto end
    ) else (
    goto loop
    )

:loop

echo Insert the name of the folder:
set /p name=<"C:\test\test.txt"

for /F "skip=1 delims=" %%a in ('type "C:\test\test.txt" ^& del "C:\test\test.txt"') do >> "C:\test\test.txt" echo %%a

echo Insert the name of the subfolder: 
set /p name2=<"C:\test\test.txt"

for /F "skip=1 delims=" %%a in ('type "C:\test\test.txt" ^& del "C:\test\test.txt"') do >> "C:\test\test.txt" echo %%a

md "C:\test\%name%\testing %name2% 999"

move "C:\test\*%name2%*.txt" "C:\test\%name%\testing %name2% 999"
if exist "C:\test\test.txt" goto loop

:end

pause
exit

我想在“echo Insert the name of the folder:”之前做一个“if”,这样如果“test”文本文件的第一行包含这个字符中的任何一个“\ / : * ?” < > | " 它将删除那些特殊字符

标签: batch-file

解决方案


看起来文件C:\test\test.txt应该包含一组文件夹名称,奇数行是主文件夹名称,偶数行是子文件夹名称,没有路径。

Microsoft 在有关命名文件、路径和命名空间的文档页面上解释了文件/文件夹名称中不允许使用哪些字符。

如果具有文件夹名称的文本文件中的一行包含文件夹名称的无效字符,则删除该字符并不是真正的解决方案,因为将包含子文件夹名称的文件移动到子文件夹中很可能没有真正的帮助。

我建议以下批处理文件执行此任务:

@echo off
if not exist "C:\test\test.txt" goto end
setlocal EnableExtensions DisableDelayedExpansion
set "MainFolderName="
set "SubfolderName="

for /F "usebackq eol=| delims=" %%I in ("C:\test\test.txt") do (
    if not defined MainFolderName (
        set "MainFolderName=%%~nxI"
    ) else (
        set "SubfolderName=%%~nxI"
        setlocal EnableDelayedExpansion
        md "C:\test\!MainFolderName!\testing !SubfolderName! 999" 2>nul
        if exist "C:\test\!MainFolderName!\testing !SubfolderName! 999\" (
            move "C:\test\*!SubfolderName!*.txt" "C:\test\!MainFolderName!\testing !SubfolderName! 999\"
            rd "C:\test\!MainFolderName!\testing !SubfolderName! 999\" 2>nul
        )
        endlocal
        set "MainFolderName="
        set "SubfolderName="
    )
)
endlocal

:end
pause

我不建议exit在批处理文件中使用命令,尤其是不要在批处理文件的末尾。这没什么用,而且缺点是调试批处理文件变成了一场噩梦。

带有选项的命令FOR/F和双引号中的其他选项逐行处理文本文件,并跳过空行和以|.

从最后一行读取的第一个字符串\/分配给变量MainFolderName

\从 last or之后的一行读取的第二个字符串/分配给 variable SubfolderName

启用下一个延迟扩展,以便能够引用两个环境变量的字符串值。

该目录是通过将其从句柄STDERR重定向到设备NUL来抑制错误输出而创建的。如果文件夹或子文件夹名称包含无效字符,则会输出错误。

IF条件检查目录是否确实存在,这不是两个目录名称之一中的无效字符的情况。因此命令MOVE仅在有效文件夹名称上执行,命令RD在移动文件后删除仍为空的目录。

然后在处理文本文件中的下两行之前删除这两个环境变量。

可以处理从文本文件中读取的行,例如:

如何验证变量是否包含 Windows Batch 中的有效文件名

但我认为,这并不是真的必要。最好的文件夹名称验证由文件系统本身完成。因此,在这种情况下,实际上不需要从从文本文件读取的行中删除文件夹名称中不允许的所有字符。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • md /?
  • move /?
  • pause /?
  • rd /?
  • set /?
  • setlocal /?

另请阅读有关使用命令重定向运算符的Microsoft 文章,了解2>nul.


推荐阅读