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

问题描述 投票:0回答:2

tl;dr

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


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

我希望创建一个脚本,可以在受监视文件夹中发生更改时触发进程。我在互联网上找到了一个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。”中第二个点之后的所有事情?

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

非常感谢你。

powershell path filesystems
2个回答
0
投票
 Test-Path -Type Leaf -LiteralPath $Event.SourceEventArgs.FullPath

告诉你路径字符串$Event.SourceEventArgs.FullPath是指(现有)文件,而不是目录(-Type Container)。


0
投票

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

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

我发现它的测试速度大约是测试路径的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;}                            
© www.soinside.com 2019 - 2024. All rights reserved.