Powershell测试文件夹是否为空


71

在Powershell中,如何测试目录是否为空?


7
投票否决的人没有评论原因。正在投票。
SpellingD

@SpellingD:我希望一直都是这样。:)
Neolisk

Answers:


54

尝试这个...

$directoryInfo = Get-ChildItem C:\temp | Measure-Object
$directoryInfo.count #Returns the count of all of the objects in the directory

如果为$directoryInfo.count -eq 0,则您的目录为空。


8
gci默认情况下不会显示隐藏文件,因此您需要使用-force参数来确保目录真正为空。
SpellingD

5
是否需要查找每个文件?这可能很耗时。
MuiBienCarlota 2014年

@SpellingD会失败,因为文件夹确实为空,但是使用-force会打开desktop.ini隐藏的系统文件
mikew

1
“ directoryInfo.count”不返回目录中所有文件的计数,而是返回内部所有文件和子目录的计数。因此,如果您有0个文件但有1个子文件夹,它将返回
Benjamin

@Benjamin为清楚起见进行了编辑。如果您只想检查目录中是否没有文件,则将-file参数添加到Get-ChildItem,例如$directoryInfo = Get-ChildItem C:\temp -file | Measure-Object
Doktor J

68

如果您对隐藏文件或系统文件不感兴趣,也可以使用Test-Path

要查看目录中.\temp是否存在文件,可以使用:

Test-Path -Path .\temp\*

或不久:

Test-Path .\temp\*

3
+1为这种整洁的检查方式。这应该被接受。顺便说一句,您甚至可以Test-Path .\temp\*(不带-Path)进行操作。
Neolisk

有谁知道这是否仍然遍及整个全球?还是遇到任何事情就停止
肯尼2015年

2
不确定要理解您的问题,因为如果temp内部存在目录,则temp不再被视为空。
JPBlanc

@kenny不应该递归。它只需要签入单个目录。在大部分,应该列出的全部内容。
jpmc26 2016年

您还可以使用以下命令进行否定:if(-Not(Test-Path。\ temp *){}
Clinton Ward

18

为了防止枚举c:\ Temp下的每个文件(这可能很耗时),我们可以执行以下操作:

if((Get-ChildItem c:\temp\ -force | Select-Object -First 1 | Measure-Object).Count -eq 0)
{
   # folder is empty
}

这是迄今为止最快的解决方案,因为它不会枚举所有文件,只是在找到的第一个文件处停止。要检查文件夹中是否存在文件,请使用(Get-ChildItem -LiteralPath 'S:\Test\' -File -Force | Select-Object -First 1 | Measure-Object).Count -ne 0代替Test-Path 'S:\Test\*' -PathType Leaf
DarkLite1 '02

除非您使用PowerShell v1,否则Measure-Object并不会在此处添加任何内容。
培根

4
filter Test-DirectoryEmpty {
    [bool](Get-ChildItem $_\* -Force)
}

为什么 !!?谢谢您的解释!
CB。

用于将结果转换为布尔值。
2012年


1

只需添加到JPBlanc中,如果目录路径为$ DirPath,则此代码也适用于包含方括号字符的路径。

    # Make square bracket non-wild card char with back ticks
    $DirPathDirty = $DirPath.Replace('[', '`[')
    $DirPathDirty = $DirPathDirty.Replace(']', '`]')

    if (Test-Path -Path "$DirPathDirty\*") {
            # Code for directory not empty
    }
    else {
            # Code for empty directory
    }

1

获取所有文件和目录并仅对目录是否为空进行计数是一种浪费。使用.NET更好EnumerateFileSystemInfos

$directory = Get-Item -Path "c:\temp"
if (!($directory.EnumerateFileSystemInfos() | select -First 1))
{
    "empty"
}

1
#################################################
# Script to verify if any files exist in the Monitor Folder
# Author Vikas Sukhija 
# Co-Authored Greg Rojas
# Date 6/23/16
#################################################


################Define Variables############ 
$email1 = "yourdistrolist@conoso.com" 
$fromadd = "yourMonitoringEmail@conoso.com" 
$smtpserver ="mailrelay.conoso.com" 

$date1 = get-date -Hour 1 -Minute 1 -Second 1
$date2 = get-date -Hour 2 -Minute 2 -Second 2 

###############that needs folder monitoring############################ 


$directory = "C:\Monitor Folder"

$directoryInfo = Get-ChildItem $directory | Measure-Object
$directoryInfo.count


if($directoryInfo.Count -gt '0') 
{ 

#SMTP Relay address 
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer) 

#Mail sender 
$msg.From = $fromadd 
#mail recipient 
$msg.To.Add($email1) 
$msg.Subject = "WARNING : There are " + $directoryInfo.count + " file(s) on " + $env:computername +  " in " + " $directory 
$msg.Body = "On " + $env:computername + " files have been discovered in the " + $directory + " folder."
$smtp.Send($msg) 

} 

Else
      { 
    Write-host "No files here" -foregroundcolor Green 
      } 

3
尽管我当然想鼓励您在StackOverflow G上发布文章,但有意或无意地忽略了几种“最佳实践”。(a)通常,您不应该在没有解释的情况下发布代码。(b)您不应该重新发布别人给出的相同答案(如果您在此处滚动查看答案,则至少收到两次)。(c)您不应包含一大堆无关的代码-90%的代码与所提出的问题无关。我不会拒绝投票,只是希望您做好准备,以防万一您看到一些反对票。
Michael Sorens

1

简单的方法

if (-Not (Test-Path .\temp*) 
{
 #do your stuff here
} 

您可以删除-Not是否要在存在文件时输入“ if”



1
    $contents = Get-ChildItem -Path "C:\New folder"
    if($contents.length -eq "") #If the folder is empty, Get-ChileItem returns empty string
    {
        Remove-Item "C:\New folder"
        echo "Empty folder. Deleted folder"
    }
    else{
    echo "Folder not empty"
    }

1
#Define Folder Path to assess and delete
$Folder = "C:\Temp\Stuff"

#Delete All Empty Subfolders in a Parent Folder
Get-ChildItem -Path $Folder -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

#Delete Parent Folder if empty
If((Get-ChildItem -Path $Folder -force | Select-Object -First 1 | Measure-Object).Count -eq 0) {Remove-Item -Path $CATSFolder -Force -Recurse}

如果-Path $_.FullName在Get-ChildItem中使用,则可能会遇到严重的问题。使用-LiteralPath !!!
it3xl

0

从Get-ChildItem获取计数可能会提供错误的结果,因为空文件夹或错误访问文件夹可能导致计数为0。

我检查空文件夹的方法是找出错误:

Try { # Test if folder can be scanned
   $TestPath = Get-ChildItem $Path -ErrorAction SilentlyContinue -ErrorVariable MsgErrTest -Force | Select-Object -First 1
}
Catch {}
If ($MsgErrTest) { "Error accessing folder" }
Else { # Folder can be accessed or is empty
   "Folder can be accessed"
   If ([string]::IsNullOrEmpty($TestPath)) { # Folder is empty
   "   Folder is empty"
   }
}

上面的代码首先尝试访问该文件夹。如果发生错误,则输出发生错误。如果没有错误,请声明“可以访问文件夹”,然后检查是否为空。


0

在研究了一些现有答案并进行了一些试验之后,我最终使用了这种方法:

function Test-Dir-Valid-Empty {
    param([string]$dir)
    (Test-Path ($dir)) -AND ((Get-ChildItem -att d,h,a $dir).count -eq 0)
}

这将首先检查有效目录Test-Path ($dir))。然后,它会检查任何内容,包括任何目录,隐藏文件,或者“常规”文件**由于属性dha分别。

用法应该足够清楚:

PS C_\> Test-Dir-Valid-Empty projects\some-folder
False 

...或者:

PS C:\> if(Test-Dir-Valid-Empty projects\some-folder){ "empty!" } else { "Not Empty." }
Not Empty.

**实际上,我不确定100%的定义效果在a这里,但是在任何情况下都确实会导致所有文件都包含在内。该文档指出ah显示隐藏文件,并且我相信as应该显示系统文件,因此我猜测a它仅显示“常规”文件。如果从上面的函数中删除它,则它将在任何情况下都找到隐藏文件,但找不到其他文件。


0

您可以使用该方法.GetFileSystemInfos().Count检查目录数。微软文档

$docs = Get-ChildItem -Path .\Documents\Test
$docs.GetFileSystemInfos().Count
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.