batch-file - 如何使用批处理文件选择性地删除文本文件中的文本?
问题描述
@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”文本文件的第一行包含这个字符中的任何一个“\ / : * ?” < > | " 它将删除那些特殊字符
解决方案
看起来文件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
.
推荐阅读
- amazon-web-services - AWS 侦听器 cf 模板在 aws cli 中给出错误,但在控制台中有效(设计模板)
- azure - 将对 Azure 应用程序 (WebApi) 的访问限制为仅对另一个 Azure 应用程序(守护程序客户端)
- arrays - 无法将while循环中的项目附加到bash中的空数组
- php - 寻找可靠的方法来知道我的手机是否在家
- c# - 减去不同的第 1 列和第 2 列的数据,在第 3 列显示其答案
- flutter - 我无法在颤振视频播放器中从 http 路径流式传输视频
- reactjs - 如何调试 React 插件
- oracle - 按日期范围对多列中的值求和
- installation - Inno Setup:复制文件(到 System32)需要很长时间
- angular - mat-button的Angular 6 Confirmation Dialog指令