【发布时间】:2018-10-29 20:43:04
【问题描述】:
我想从带有模式的文件夹中删除文件。我正在使用一个调用 Windows 命令并打印命令日志的 C# 程序。目前我正在使用这个命令:
del Test\*xyz* /s
使用 /s 开关,我得到了在日志中被删除的文件列表。但是 /s 开关也会从我不想要的子目录中删除文件。有没有办法删除文件并获取文件列表?
【问题讨论】:
我想从带有模式的文件夹中删除文件。我正在使用一个调用 Windows 命令并打印命令日志的 C# 程序。目前我正在使用这个命令:
del Test\*xyz* /s
使用 /s 开关,我得到了在日志中被删除的文件列表。但是 /s 开关也会从我不想要的子目录中删除文件。有没有办法删除文件并获取文件列表?
【问题讨论】:
如果我对您的问题的理解正确,您想删除文件夹中的文件(子目录中没有文件)。您可以通过在批处理文件中使用for-loop 来实现此目的。
对于您的用例,您可以将以下内容写入批处理 (.bat) 文件:
@ECHO OFF
for /f %%i in ('dir Test\*xyz* /b /a-d') do (
echo %%i
del %%i
)
循环遍历dir 命令结果中的每一行,并将文件名打印到控制台。之后就被删除了。
正如for-loop 的文档所述:
迭代和文件解析
使用文件解析来处理命令输出、字符串和文件内容。使用迭代变量来定义您要检查的内容或字符串,并使用各种 ParsingKeywords 选项来进一步修改解析。使用 ParsingKeywords 标记选项来指定哪些标记应作为迭代变量传递。 请注意,当不使用令牌选项时,/f 将只检查第一个令牌。
文件解析包括读取输出、字符串或文件内容,然后将其分解为单独的文本行,并将每一行解析为零个或多个标记。然后使用设置为标记的迭代变量值调用 for 循环。默认情况下,/f 从每个文件的每一行传递第一个空格分隔的标记。空白行被跳过。
语法是:
for /f ["<ParsingKeywords>"] {%%|%}<Variable> in (<Set>) do <Command> [<CommandLineOptions>] for /f ["ParsingKeywords"] {%%|%}<Variable> in ("<LiteralString>") do <Command> [<CommandLineOptions>] for /f ["<ParsingKeywords>"] {%%|%}<Variable> in ('<Command>') do <Command> [<CommandLineOptions>]
所以在上面的例子中,我们使用了最后一个版本(使用了命令的输出)。 指定的命令是dir 命令。
正如dir 命令的文档所述:
/b显示目录和文件的裸列表,没有其他信息。 /b 覆盖 /w。
和
/a[[:]<Attributes>]仅显示具有您指定属性的目录和文件的名称。如果省略 /a,dir 将显示除隐藏文件和系统文件之外的所有文件的名称。如果使用 /a 而不指定 Attributes,则 dir 会显示所有文件的名称,包括隐藏文件和系统文件。以下列表描述了可用于属性的每个值。使用冒号 (:) 是可选的。使用这些值的任意组合,不要用空格分隔这些值。
d目录h隐藏文件s系统文件l重新解析点r只读文件a文件准备就绪归档i非内容索引文件-前缀表示“不”
所以您需要使用/b 来作为文件名的裸列表,并使用/a-d 来排除结果列表中可能存在的目录。
附带说明:您也可以使用纯 C# 来实现这些目标。如果您需要帮助,请告诉我 ;-)
【讨论】: