Windows Cmd - 如何删除除给定文件类型之外的所有文件

时间:2017-07-04 15:20:16

标签: c# windows command-line cmd command-prompt

我正在寻找类似的东西:

  Process.Start("cmd.exe", "/C del path\*.(filetypetobedeleted)");

但我想删除除一种文件类型(.txt)之外的所有文件。这包括路径中的文件夹,因此我希望删除路径中的所有内容,但是.txt文件。

2 个答案:

答案 0 :(得分:2)

.NET具有用于处理目录和文件的内置类型。使用这些类比仅仅执行del开始一个单独的过程更容易。

你可以这样写:

var skipExtension=".some";
var directory=new DirectoryInfo(myTargetPath);
var filesToKill=directory.EnumerateFiles()
                         .Where(fi=>fi.Extension!=skipExtension);
foreach(var file in filesToKill)
{
    file.Delete();
}

EnumerateFiles具有允许搜索特定模式和搜索所有子目录的重载,例如:

EnumerateFiles("*.*",SearchOption.AllDirectories)

如果您绝对 使用批处理,请使用PowerShell,而不是cmd。您可以使用PowerShell类直接从C#创建和执行PowerShell管道。

del是PowerShell中Remove-Item的同义词,其中包含-Exclude参数。如果要排除特定扩展名,可以写:

Remove-Item c:\scripts\*.* -Exclude *.wav

del c:\scripts\*.* -Exclude *.wav

要从C#程序执行此命令,您需要创建PowerShell实例并添加命令和参数:

PowerShell ps = PowerShell.Create();
ps.AddCommand("Remove-Item")
  .AddParameter("Path",@"h:\test\*.*")
  .AddParameter("Exclude","*.svc");
var results=ps.Invoke();

如果您还要删除文件夹,则需要添加-Recurse参数

PowerShell ps = PowerShell.Create();
ps.AddCommand("Remove-Item")
  .AddParameter("Path",@"h:\test\*")
  .AddParameter("Exclude","*.svc")
  .AddParameter("Recurse");
var results=ps.Invoke();

答案 1 :(得分:1)

这样的事情可以解决问题:

// Set as read-only
Process.Start("cmd.exe", "/C attrib +r " + path + "\\*." + ext);

// Del will skip read-only
Process.Start("cmd.exe", "/C del " + path + "/q *");

// Rm folders recursively
Process.Start("cmd.exe", "/C for /d %i in (" + path + "\\*) do rd /s /q \"%i\"");

// Remove read-only
Process.Start("cmd.exe", "/C attrib -r " + path + "\\*." + ext);

你可能想给它一点时间来做它的事情。正如@TheLethalCoder所提到的,如果使用单个proc.WaitForExit()实例,则可以Process

修改:这很快变得丑陋。您应该使用.NET。甚至是@PanagiotisKanavos解释的Power-Shell。