for /f命令之—Delims和Tokens用法&总结

  “For /f”常用来解析文本,读取字符串。分工上,delims负责切分字符串,而tokens负责提取字符串。如果把字符串当作蛋糕,Delims像刀子,用来切蛋糕,tokens像叉子,用来取切好的蛋糕。下面我们用实例来进行理解。

  • 把以下内容保存为文本文件“歌曲列表.txt”,注意扩展名为“.txt”:序号、歌手名-歌曲名.后缀名
1、饶天亮-玫瑰爱人.wma
2、高一首-我不愿错过.mp3
3、黃凱芹-傷感的戀人.MP3
4、黄灿-黄玫瑰.lrc
5、黎姿-如此这般的爱情故事.mp3

代码1:显示全部内容

@echo off
for /f %%i in (歌曲列表.txt) do echo %%i
pause>nul
  • 运行拮果:序号、歌手名-歌曲名.后缀名
1、饶天亮-玫瑰爱人.wma
2、高一首-我不愿错过.mp3
3、黃凱芹-傷感的戀人.MP3
4、黄灿-黄玫瑰.lrc
5、黎姿-如此这般的爱情故事.mp3

如果不使用参数“/f”,运行拮果只显示括号里的文字字符“歌曲列表.txt”,而不能读取文本文件“歌曲列表.txt”中的内容。可见,“/f”是解析文本字符串的好工具。

代码2: delims 默认提取第一列

  假如只要序号,不要歌手名、歌曲名和后缀名,如何办到?

@echo off
for /f "delims=、" %%i in (歌曲列表.txt) do echo %%i
pause>nul
  • 运行拮果:序号
1
2
3
4
5

"delims=、"表示定义顿号“、”为分隔符,并用该分隔符“、”切分文本字符串。字符串就是“歌曲列表.txt”里的内容,也就是文件里的文字和标点符号。
该顿号是原文中就有的。除了顿号“、”,原文中还有减号“-”和点号“.”,因此你也可以用它们来做分隔符。

代码3:用减号“-”做分隔符

@echo off
for /f "delims=-" %%i in (歌曲列表.txt) do echo %%i
pause>nul
  • 运行拮果:
    序号、歌手名
1、饶天亮
2、高一首
3、黃凱芹
4、黄灿
5、黎姿

因为,当减号“-”被用做分隔符时,每行内容被减号“-”分隔成前后两半,默认只显示前半部分,而后半部分连同分隔符减号“-”都被忽略(省略)了。

代码4:用点号“.”做分隔符

@echo off
for /f "delims=." %%i in (歌曲列表.txt) do echo %%i
pause>nul
  • 运行拮果:
    序号、歌手名-歌曲名
1、饶天亮-玫瑰爱人
2、高一首-我不愿错过
3、黃凱芹-傷感的戀人
4、黄灿-黄玫瑰
5、黎姿-如此这般的爱情故事

默认情况下,单纯使用delims而不用tokens时,只显示第一个分隔符前的内容,第一个分隔符和第一个分隔符后面的内容将被忽略。

代码5:定义多个分隔符

@echo off
for /f "delims=、-." %%i in (歌曲列表.txt) do echo %%i
pause>nul
  • 运行拮果:
    序号
1
2
3
4
5

原因是,当定义顿号“、”、减号“-”和点号“.”三个标点符号为分隔符后,原文被分隔成四个部分。
如第二行“1、饶天亮-玫瑰爱人.wma”将被分隔成“1”、“饶天亮”、“玫瑰爱人”和“wma” 四个部分。
从第一行到最后一行,每行的每个部分对应下来相当于一个竖列。因此,原文就有“序号”、“歌手名”、“歌曲名”、“后缀名”四列。
一般情况下,只读取第一列的内容。后面的内容需要用tokens选项提取。

  假如只要歌手名和歌曲名,不要序号和后缀名,如何办到?

代码6:提取单列

@echo off
for /f "tokens=2 delims=、." %%i in (歌曲列表.txt) do echo %%i
pause>nul
  • 运行拮果将显示:
    歌手名-歌曲名
饶天亮-玫瑰爱人
高一首-我不愿错过
黃凱芹-傷感的戀人
黄灿-黄玫瑰
黎姿-如此这般的爱情故事

用delims定义顿号“、”和点号“.”作为分隔符,将原文分成三部分。
如第六行“5、黎姿-如此这般的爱情故事.mp3”被分割成:
第一部分(第一列):5
第二部分(第二列):黎姿-如此这般的爱情故事
第三部分(第三列):mp3
“tokens=2”表示用tokens提取第二列的字符串,即“黎姿-如此这般的爱情故事”。
没有被tokens定义提取的第一列和第三列将被忽略。

  假如只要序号和歌曲名,而不要歌手名和后缀名,如何办到?

代码7:提取多列

@echo off
for /f "tokens=13 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j
pause>nul
  • 运行拮果将显示:
    序号 歌曲名
1 玫瑰爱人
2 我不愿错过
3 傷感的戀人
4 黄玫瑰
5 如此这般的爱情故事

“delims=、-.”表示定义顿号、减号和点号为分隔符。
“tokens=13”表示只提取第一列和第三列。
“%%i %%j”对应于“token”后面的列数。有多少列就要有多少个输出变量,并且各变量中的字母存在先后顺序。

  如何只提取文字,不要标点符号?

#代码8:忽略分隔符

@echo off
for /f "tokens=12-4 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j %%k %%l
pause>nul
  • 运行拮果:
    序号 歌手名 歌曲名 后缀名
1 饶天亮 玫瑰爱人 wma
2 高一首 我不愿错过 mp3
3 黃凱芹 傷感的戀人 MP3
4 黄灿 黄玫瑰 lrc
5 黎姿 如此这般的爱情故事 mp3

默认情况下,用做分隔符的标点符号将被忽略。
“tokens=12-4”中的“2-4”表示第二至第四列。

  • 27
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 以下是批处理脚本: ``` @echo off forfiles /p "C:\backup" /s /m *.* /d -3 /c "cmd /c del @path" ``` 说明: - `@echo off`:关闭命令的回显。 - `forfiles`:循环遍历文件。 - `/p`:指定目录。 - `/s`:递归搜索子目录。 - `/m`:指定要查找的文件名匹配模式,这里是所有文件。 - `/d -3`:指定文件创建时间超过 3 天的文件。 - `/c`:指定要执行的命令,这里是删除文件。 - `@path`:表示文件的完整路径。 请注意,上面的代码仅适用于 Windows 系统。如果您使用的是其他系统,请查找相应的命令。 ### 回答2: 实现上述功能,可以使用批处理脚本来进行操作。以下是一个可以实现删除/备份目录下创建时间超过3天的文件的批处理脚本: ```batch @echo off set "target_dir=C:\path\to\your\directory" // 设置目标目录 set cutoff_date=%date% powershell -command "& { $limit=(Get-Date).AddDays(-3); Get-ChildItem '%target_dir%' -Recurse | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | ForEach-Object { $_.FullName } }" >archive.txt for /f "delims=" %%G in (archive.txt) do ( echo %%G REM 备份操作 xcopy "%%G" "C:\path\to\backup\directory" REM 删除操作 del "%%G" /q /f ) del archive.txt ``` 解释说明: 1. 首先,我们需要将目标目录设置为“target_dir”。将其替换为你要操作的目标目录的实际路径。 2. 接下来,使用PowerShell命令来获取目标目录中所有创建时间早于3天的文件的路径,并将其输出到一个名为“archive.txt”的文件中。 3. 然后,使用for循环逐行读取“archive.txt”文件中的每个文件路径,并执行相应的操作。 - 若要备份文件,可以使用“xcopy”命令,将文件复制到一个备份目录中,将"C:\path\to\backup\directory"替换为你要备份到的实际路径。 - 若要删除文件,可以使用“del”命令,删除文件,其中“/q”参数表示安静模式(不显示确认提示),“/f”参数表示强制删除只读文件。 4. 最后,删除“archive.txt”文件。 请注意,此脚本使用了PowerShell命令来获取创建时间早于3天的文件的路径。因此,确保你的系统支持PowerShell。如果不支持PowerShell,可以使用其他方法来实现相同的功能。 ### 回答3: 批处理是一种用来自动执行一系列命令的脚本。您可以编写一个批处理来删除或备份目录下创建时间超过3天的文件。 下面是一个简单的批处理示例,用于删除/backup目录下创建时间超过3天的文件: ```batch @echo off setlocal set "backup_dir=C:\backup" set "days=3" for /f "delims=" %%a in ('dir /b /a:-d-h-s "%backup_dir%\*" ^| findstr /r /i /l /c:"^[^ ]* *[0-9]* \[/][0-9]*.*"') do ( for /f "usebackq tokens=2,* delims= " %%b in (`dir /T:C "%backup_dir%\%%a" ^| findstr /v "^[^0-9]"`) do ( call :comparedate "%%b %%c" if !datediff! gtr %days% ( echo Deleting file: "%%a" del "%backup_dir%\%%a" /F ) ) ) endlocal goto :eof :comparedate setlocal set "targetdate=%~1" set "currdate=%date% %time%" set "targetdate=!targetdate:,=.!" set "currdate=!currdate:,=.!" for /f "tokens=1-6 delims=." %%a in ("!targetdate! !currdate!") do ( set /a "yy1=10000%%a%%10000, mm1=100%%b%%100, dd1=100%%c%%100, hh1=100%%d%%100, nn1=100%%e%%100, ss1=100%%f%%100" ) set /a "datediff=(yy1-yy)*365+(mm1-mm)*30+(dd1-dd)" endlocal & set "datediff=%datediff%" goto :eof ``` 此批处理脚本首先设置了变量`backup_dir`为备份目录的路径,设置`days`为期望超过多少天的阈值。然后,它使用`for`循环遍历`dir`命令查找到的目录下的所有文件。使用`findstr`筛选出创建日期信息。然后,批处理将获取的日期与当前日期进行比较,并计算它们之间的日期差。如果日期差大于`days`,则使用`del`命令删除文件。 使用这个批处理前,请确保将`backup_dir`设置为要处理的实际备份目录,并根据需要更改`days`参数。请注意,批处理脚本具有潜在的风险,因此,请谨慎测试和使用。 希望这对您有帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值