如何判断路径是文件还是目录?

时间:2019-04-09 16:33:11

标签: powershell path filesystems

tl;dr

给出文件系统路径,如何确定它是指PowerShell中的文件还是目录?


首先,我实际上对Powershell几乎一无所知,所以请原谅我可能会在这篇文章中显示的任何无知。

我希望创建一个脚本,该脚本可以在受监视的文件夹中发生更改时触发进程。我在Internet上找到了Powershell脚本,我认为这为我提供了很好的开端。但是,在对其进行一些调整并进行了测试之后,我发现了它的问题。

该脚本基本上会创建更改日志文件并将其附加到受监视的文件夹和子文件夹,并且看起来效果很好。但是,如果我在子文件夹中进行任何更改,并将这些更改记录在日志文件中,它也会在日志文件中添加一行,表明子文件夹本身已更改,就好像它是一个文件一样。改变了。

每当文件更改时,我都需要脚本来触发一个进程,但是除了由子文件夹内的任何更改触发的进程之外,它一定不能触发额外的进程。希望您能理解我在这里所说的话。

因此,我需要一种区分文件更改时间和文件夹更改时间的方法(该方法很好地集成到了我发现的脚本中)。

脚本(我做了一点修改)如下:

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "monitoredfolder"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$action = {
            $path = $Event.SourceEventArgs.FullPath
            $Name = $Event.SourceEventArgs.Name
            $OldName = $Event.SourceEventArgs.OldName
            $OldFullPath = $Event.SourceEventArgs.OldFullPath
            $changeType = $Event.SourceEventArgs.ChangeType
            $logline = "$(Get-Date), $changeType, $OldFullPath, $path, $OldName, $Name"
            Add-content "log.txt" -value $logline
          }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
Register-ObjectEvent $watcher "Deleted" -Action $action
Register-ObjectEvent $watcher "Renamed" -Action $action
while ($true) {sleep 5}

我希望能够在$ action部分添加一行,以创建另一个变量,该变量可以作为日志文件中的一列添加。纯粹基于猜测,我尝试了以下方法和其他方法,但是它们没有用:

$pathtype = $Event.SourceEventArgs.FullPathType

$pathAttributes = $Event.SourceEventArgs.FullPathAttributes

$Attributes = $Event.SourceEventArgs.Attributes

$IsDirectory = $Event.SourceEventArgs.IsDirectory

说实话,我并不是真的希望他们能工作,但我想我会给他们一个机会。

这里有没有人知道“ $ Event.SourceEventArgs”中第二个点之后可能发生的所有事情?

我应该采取另一种方法吗?

非常感谢您。

2 个答案:

答案 0 :(得分:0)

.updateMany

告诉您路径字符串 Test-Path -Type Leaf -LiteralPath $Event.SourceEventArgs.FullPath 是指向(现有的)文件,而不是目录$Event.SourceEventArgs.FullPath)。

答案 1 :(得分:0)

另一种方法是使用System.IO.FileExists静态方法。

[System.IO.File]::Exists($Event.SourceEventArgs.FullPath)

我发现在进行更多类型的输入测试时,它大约比Test-Path快4倍。

要回答另一个问题:Does anyone here know all of the things which can go after the second dot in "$Event.SourceEventArgs."?,可以通过将对象发送到Get-Member来轻松找出对象上可用的属性和方法。

将动作更改为

$action = {
            $Event.SourceEventArgs | Get-Member
          }

,然后从创建的作业中检索输出,将列出对象的属性,方法和类型。

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
3      fe46cc0b-51e...                 NotStarted    False                                ...                      



PS> Get-Job 3 | Receive-Job -Keep


   TypeName: System.IO.FileSystemEventArgs

Name        MemberType Definition                                    
----        ---------- ----------                                    
Equals      Method     bool Equals(System.Object obj)                
GetHashCode Method     int GetHashCode()                             
GetType     Method     type GetType()                                
ToString    Method     string ToString()                             
ChangeType  Property   System.IO.WatcherChangeTypes ChangeType {get;}
FullPath    Property   string FullPath {get;}                        
Name        Property   string Name {get;}