代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

PowerShell-“删除此文件夹中除一个以外的所有文件”的最紧凑方式

  •  3
  • BuddyJoe  · 技术社区  · 15 年前

    从文件夹中删除所有文件的最简单方法是什么 除了 PowerShell脚本中的一个文件。我一点也不在乎保存哪个文件,只要保存一个就行。

    我正在使用PowerShell 2 CTP。

    更新:
    到目前为止所有答案的结合…

    $fp = "\\SomeServer\SomeShare\SomeFolder"
    gci $fp |where {$_.mode -notmatch "d"} |sort creationtime -desc |select -last ((@(gci $fp)).Length - 1) |del 
    

    有人看到使用这个有什么问题吗?不匹配部分怎么样?

    5 回复  |  直到 15 年前
        1
  •  9
  •   Jeffrey Snover - MSFT    15 年前

    在PS V2中,我们添加了-跳过以选择,这样您可以执行以下操作:

    dir其中$UU.mode-notmatch“d”select-skip 1 del

        2
  •  4
  •   JaredPar    15 年前

    如果没有任何内置函数,它会有点复杂,因为函数需要处理确定的长度。但是您可以这样做,这涉及到两次查看目录

    gci $dirName | select -last ((@(gci $dirName)).Length-1) | del
    

    我编写了几个PowerShell扩展,使类似这样的任务更加容易。一个例子是跳过计数,它允许在管道中跳过任意数量的元素。因此,可以快速搜索代码,以便只查看目录一次

    gci $dirName | skip-count 1 | del
    

    要跳过的源计数: http://blogs.msdn.com/jaredpar/archive/2009/01/13/linq-like-functions-for-powershell-skip-count.aspx

    编辑

    为了杀死文件夹,请使用“rm-re-fo”而不是“del”

    编辑2

    为了避免所有文件夹(空的或非空的),可以这样修改代码。

    gci $dirName | ?{ -not $_.PSIsContainer } | skip-count 1 | del
    

    psisContainer成员仅对文件夹有效。

        3
  •  1
  •   zdan    15 年前

    怎么样:

    dir $dirName | select -first ((dir $dirName).Length -1) | del
    

    删除除最后一个以外的所有内容。

    编辑: 更灵活的版本,而且您不必输入dir命令两次:

    $include=$False; dir $dirNam | where {$include; $include=$True;} | del
    

    注意,这与之相反,它删除除第一个以外的所有内容。它还允许您添加子句,例如不作用于目录:

    $include=$False; dir $dirNam | where {$include -and $_.GetType() -ne [System.IO.DirectoryInfo]; $include=$True;} | del
    

    编辑2 关于使用模式属性排除目录。如果框架不改变模式字符串的生成方式,我想这应该是可行的(我无法想象它会这样做)。尽管我可能会将正则表达式加强到:

    $_.Mode -notmatch "^d.{4}"
    

    如果您试图避免键入内容,最好在配置文件中添加一个函数:

    function isNotDir($file) { return $file.GetType() -ne [System.IO.DirectoryInfo];}
    dir $dirName | where {isNotDir($_)}
    
        4
  •  1
  •   Joshua    15 年前

    我最喜欢的是:

    move file to preserve elsewhere
    delete all files
    move preserved file back
    
        5
  •  0
  •   Chris Ballance    15 年前

    德尔 . -排除(dir sort creationtime-desc)[0]-whatif

    这将删除除最近创建的文件以外的所有文件。