在Powershell中,如何测试目录是否为空?
Answers:
尝试这个...
$directoryInfo = Get-ChildItem C:\temp | Measure-Object
$directoryInfo.count #Returns the count of all of the objects in the directory
如果为$directoryInfo.count -eq 0
,则您的目录为空。
gci
默认情况下不会显示隐藏文件,因此您需要使用-force
参数来确保目录真正为空。
-force
会打开desktop.ini
隐藏的系统文件
-file
参数添加到Get-ChildItem,例如$directoryInfo = Get-ChildItem C:\temp -file | Measure-Object
如果您对隐藏文件或系统文件不感兴趣,也可以使用Test-Path
要查看目录中.\temp
是否存在文件,可以使用:
Test-Path -Path .\temp\*
或不久:
Test-Path .\temp\*
Test-Path .\temp\*
(不带-Path
)进行操作。
为了防止枚举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
。
只需添加到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
}
获取所有文件和目录并仅对目录是否为空进行计数是一种浪费。使用.NET更好EnumerateFileSystemInfos
$directory = Get-Item -Path "c:\temp"
if (!($directory.EnumerateFileSystemInfos() | select -First 1))
{
"empty"
}
#################################################
# 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
}
删除空文件夹的示例:
IF ((Get-ChildItem "$env:SystemDrive\test" | Measure-Object).Count -eq 0) {
remove-Item "$env:SystemDrive\test" -force
}
#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 !!!
从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"
}
}
上面的代码首先尝试访问该文件夹。如果发生错误,则输出发生错误。如果没有错误,请声明“可以访问文件夹”,然后检查是否为空。
在研究了一些现有答案并进行了一些试验之后,我最终使用了这种方法:
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)
)。然后,它会检查任何内容,包括任何目录,隐藏文件,或者“常规”文件**由于属性d
,h
和a
分别。
用法应该足够清楚:
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
它仅显示“常规”文件。如果从上面的函数中删除它,则它将在任何情况下都找到隐藏文件,但找不到其他文件。