Как определить, является ли путь файлом или каталогом? - PullRequest
0 голосов
/ 09 апреля 2019

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."?

Есть ли другой подход, который я должен использовать?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Другой способ сделать это - использовать System.IO.File и Exists статический метод.

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

Я обнаружил, что этопримерно в 4 раза быстрее, чем Test-Path, когда тестируется для не намного большего набора текста.

Чтобы ответить на другой вопрос: 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;}                            
0 голосов
/ 09 апреля 2019
 Test-Path -Type Leaf -LiteralPath $Event.SourceEventArgs.FullPath

сообщает вам, относится ли строка пути $Event.SourceEventArgs.FullPath к (существующему) файлу , в отличие от каталога (-Type Container).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...