批处理脚本 - dir /b 在输出文件中包含目录名称和空行
Posted
技术标签:
【中文标题】批处理脚本 - dir /b 在输出文件中包含目录名称和空行【英文标题】:Batch script - dir /b is including directory names and empty lines in output file 【发布时间】:2021-09-03 12:01:03 【问题描述】:我运行这个脚本来列出超过 8 天的备份文件并在服务器中删除它们,最近它的行为很奇怪。请看下文
::Find backup files older than 8 days
::/p Specifies the path from which to start the search.
::/s Instructs the forfiles command to search into subdirectories recursively.
::/d Selects files with a last modified date within the specified time frame.
::/c Carries out the command specified by String and then stops.
::/b Displays a bare list of directories and files, with no additional information.
PUSHD \\SERVER_NAME\M$\MSSQL
FORFILES /P Backup /s /d -8 /C "cmd /c dir /B @file">K:\ScriptLogs\OutPut
POPD
这最近运行良好,直到我在 \SERVER_NAME\M$\MSSQL\Backup 中创建了更多文件夹,如 FULL、DIFF、LOG as
\\SERVER_NAME\M$\MSSQL\Backup\FULL
\\SERVER_NAME\M$\MSSQL\Backup\DIFF
\\SERVER_NAME\M$\MSSQL\Backup\LOG
K:\ScriptLogs\OutPut 文件现在包含文件夹名称 FULL 如下
FULL
SERVER_NAME_DB_DIFF_2021_06_10_040135.diff
SERVER_NAME_DB_DIFF_2021_06_11_040124.diff
SERVER_NAME_DB_DIFF_2021_06_12_040213_1.diff
我无法理解为什么它在输出列表中包含 FULL(如果我的 cmd 错误,它也应该包含 DIFF 和 LOG)。
当我修改如下代码时
PUSHD \\SERVER_NAME\M$\MSSQL
FORFILES /P Backup /s /d -8 /C "cmd /c dir /A-D /B @file">K:\ScriptLogs\OutPut
POPD
它给出如下错误,并且输出文件现在不包括 FULL(因为 /A-D 排除了 Dir's)
K:\DBScripts>PUSHD \\SERVER_NAME\M$\MSSQL
W:\MSSQL>FORFILES /P Backup /s /d -8 /C "cmd /c dir /A-D /B @file" 1>K:\ScriptLogs\OutPut
File Not Found
File Not Found
W:\MSSQL>POPD
我在这里担心的是为什么它在旧代码版本中包含完整的目录名称,并且代码运行会在新版本中出现错误。感谢您的帮助。
【问题讨论】:
你为什么要使用Dir
? %SystemRoot%\System32\forfiles.exe /P "Backup" /S /D -8 1>"K:\ScriptLogs\OutPut"
有什么问题?您还需要了解的是,尽管它的名称是 forfiles,但它不仅可以输出文件,还可以与目录一起使用。如果您打开命令提示符窗口,键入forfiles /?
,然后按[ENTER]
键,您应该清楚地看到您可以使用@IsDir==FALSE
省略这些目录。例如:%SystemRoot%\System32\forfiles.exe /P "Backup" /S /D -8 /C "%SystemRoot%\System32\cmd.exe /D /C \"If @IsDir==FALSE Echo @File\"" 1>"K:\ScriptLogs\OutPut"
.
在 FORFILES 已经在迭代文件时运行 DIR 命令似乎很奇怪。这是很多开销。
感谢@Compo 的输入,但它在文件名中添加了双引号。我使用此输出与另一个列表 'FINDSTR /p /g:K:\ScriptLogs\OutPut K:\ScriptLogs\OutPut\ON_TAPE_LIST>K:\ScriptLogs\OutPut\delete3' 进行比较,它没有给我任何源文件名有引号..我是批处理脚本的新手。谢谢
所以您对我们的回复是您使用dir /A-D /B @file
来删除封闭的双引号。因此,您应该使用%SystemRoot%\System32\forfiles.exe /P "Backup" /S /D -8 /C "%SystemRoot%\System32\cmd.exe /D /C \"If @IsDir==FALSE Dir @File /B /A:-D\"" 1>"K:\ScriptLogs\Output"
。虽然我更喜欢%SystemRoot%\System32\forfiles.exe /P "Backup" /S /D -8 /C "%SystemRoot%\System32\cmd.exe /Q /D /C \"If @IsDir==FALSE For %%G In (@File) Do Echo %%~G\"" 1>"K:\ScriptLogs\Output"
。无论哪种情况,您都可以清楚地看到,解决您的问题的方法仍然是使用@IsDir==FALSE
。
forfiles /S /P "Backup" /M "*" /D -8 /C "cmd /Q /C if @isdir==FALSE for %%I in (@file) do echo(%%~I"
呢?
【参考方案1】:
谢谢@compo ....
PUSHD \\SERVER_NAME\M$\MSSQL
FORFILES /P Backup /S /D -%NUMBER_OF_DAYS% /C "cmd /Q /D /C \"If @IsDir==FALSE For %%G In (@File) Do Echo %%~G\"" 1>K:\ScriptLogs\OutPut-%dtStamp%
POPD
这解决了问题。
【讨论】:
以上是关于批处理脚本 - dir /b 在输出文件中包含目录名称和空行的主要内容,如果未能解决你的问题,请参考以下文章