Создание сценария Powershell для получения информации о сетевой папке. Проблема с захватом и отображением LastWriteTime. - PullRequest
0 голосов
/ 11 марта 2020

Хорошо, я не программист, и мой опыт работы с Powershell - базовый c. Но здесь идет. Меня попросили собрать некоторую информацию о Справочнике, который мы переносим из нашей сети. Он собирает имена подкаталогов, размер, # файлов и папок, а также дату и экспорт в csv. Я не могу на всю жизнь сделать так, чтобы дата создания папки работала, поэтому я отказался от этого и искал время последней записи для папок, поскольку я пытаюсь выяснить, что использовалось в последнее время. Это работает только для нескольких папок, но остальные в Excel имеют system.object [] в ячейке. Супер расстраивает. Вот код Он использует gui каталог выбора.

    #Refresh network drives for session
    net use i: /delete
    net use m: /delete
    net use i: "\\wfs.queensu.ca\ADV\Workgroups"
    net use m: "\\wfs.queensu.ca\ADVMedia"


    Function Get-Folder($initialDirectory)

    {
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.Description = "Select a folder"
    $foldername.rootfolder = "MyComputer"

    if($foldername.ShowDialog() -eq "OK")
    {
    $folder += $foldername.SelectedPath
    }
     return $folder
    }

    $forDir = Get-Folder

   #Change this to the parent directory that you want counts for
   #$forDir = "\\wfs.queensu.ca\adv\workgroups\ADV Services\$seldir"

   $Dirs = Get-ChildItem $forDir -Directory -Name

   $Tab = [char]9
   $results = @()

   Write-Host $forDir


   foreach($Dir in $Dirs)
   {
   $dirSize = "{0:N2} MB" -f ((Get-ChildItem $forDir/$Dir -Recurse | Measure-Object -Property Length 
   -Sum -ErrorAction Stop).Sum / 1MB)
   $dirFiles = Get-ChildItem $forDir/$Dir -Recurse -File | Measure-Object | %{$_.Count}
   $dirFolders = Get-ChildItem $forDir/$Dir -Recurse -Directory | Measure-Object | %{$_.Count}
   #$dirDate = (Get-ChildItem $forDir/$Dir).LastWriteTime.ToString
   $dirDate = @(Get-ChildItem $forDir/$Dir | % {$_.LastWriteTime})



   $details = [ordered] @{
   dir = $Dir
   No_Files = $dirFiles
   No_Folders = $dirFolders
   size = $dirSize
   date = $dirDate
   }

   $results += New-Object PSobject -Property $details


   }


  #This line finds the last index of the slash and adding one char
  $Dirlength = $forDir.LastIndexOf('\') + 1
  #This line takes the entire length of the string minus the postion above leaving the directory name 
  $sublength = $forDir.length - $Dirlength
  #Assigns the remaining characters from the substring to the varibale to be used as the filename
  $DirName = $forDir.SubString($Dirlength, $sublength)

  $results | Export-Csv "C:\$DirName.csv"  -NoTypeInformation

  Write-Host ("Complete WOW!")

Ответы [ 3 ]

0 голосов
/ 12 марта 2020

попробуйте это ...

Get-ChildItem -Path 'D:\temp' -Recurse | 
Where-Object { $_.PSIsContainer } | 
Select-Object -Property Name, LastWriteTime
<#
# Results

Name             LastWriteTime     
----             -------------     
est              17-Feb-20 15:50:53
LogFiles         11-Mar-20 11:37:28
NewFolder        06-Feb-20 14:56:48
ParentFolder     12-Feb-20 14:24:25
Reference        03-Feb-20 11:55:47
Source           06-Feb-20 14:56:48
Target           24-Feb-20 22:03:56
New folder       03-Feb-20 11:55:24
temp             20-Jan-20 11:17:42
ChildFolder      12-Feb-20 14:08:11
GrandchildFolder 12-Feb-20 14:08:32
#>


# Or in v3 and beyond

Get-ChildItem -Path 'D:\temp' -Directory -Recurse | 
Select-Object -Property Name, LastWriteTime
<#
# Results

Name             LastWriteTime     
----             -------------     
est              17-Feb-20 15:50:53
LogFiles         11-Mar-20 11:37:28
NewFolder        06-Feb-20 14:56:48
ParentFolder     12-Feb-20 14:24:25
Reference        03-Feb-20 11:55:47
Source           06-Feb-20 14:56:48
Target           24-Feb-20 22:03:56
New folder       03-Feb-20 11:55:24
temp             20-Jan-20 11:17:42
ChildFolder      12-Feb-20 14:08:11
GrandchildFolder 12-Feb-20 14:08:32
#>
0 голосов
/ 13 марта 2020

Я знаю, что на этот вопрос уже был дан ответ, но для полноты приведем еще один способ сделать это, используя метод GetFileSystemInfos , который есть у каждого объекта DirInfo.

$rootFolder = 'X:\YourRootPath'
Get-ChildItem -Path $rootFolder -Directory -Recurse | ForEach-Object {
    # GetFileSystemInfos() (needs .NET 4+) is faster than Get-ChildItem and returns hidden objects by default
    # See: https://devblogs.microsoft.com/powershell/why-is-get-childitem-so-slow/
    $fsObjects = $_.GetFileSystemInfos('*', 'TopDirectoryOnly')   # TopDirectoryOnly --> do not recurse

    # you can also use Get-ChildItem here of course.
    # To also get hidden files, with Get-ChildItem you need to add the -Force switch
    # $fsObjects = Get-ChildItem -Path $_.FullName -Filter '*' -Force

    # from the $fsObjects array, filter out the files and directories in order to get the count
    $files   = $fsObjects | Where-Object { $_ -is [System.IO.FileInfo] }       # or: !($_.Attributes -band 'Directory')
    $folders = $fsObjects | Where-Object { $_ -is [System.IO.DirectoryInfo] }  # or: $_.Attributes -band 'Directory'
    # emit a PSObject with all properties you wish to collect
    [PsCustomObject]@{
        Path      = $_.FullName
        FileCount = $files.Count
        DirCount  = $folders.Count
        DirSize   = "{0:N2} MB" -f (($files | Measure-Object -Sum -Property Length).Sum / 1MB)
        DirDate   = $_.LastWriteTime
    }
} | Export-Csv -Path "X:\YourFolder_Info.csv" -NoTypeInformation -UseCulture
0 голосов
/ 11 марта 2020

Get-ChildItem .\dir дает вам все файлы, содержащиеся в каталоге .\dir, а не сам каталог.

Именно поэтому следующая строка в вашем скрипте создает массив LastWriteTimes для всех файлов, которые содержатся в каталог, который $forDir/$Dir разрешает в вашем foreach l oop:

$dirDate = @(Get-ChildItem $forDir/$Dir | % {$_.LastWriteTime})

Массив в $dirDate вернет ​System.Object[] при вызове его метода toString(). Это причина, почему вы видите эту строку в вашем Excel, где вы ожидаете метку времени папки.

Могу поспорить, что те папки, которые, кажется, работают, имеют ровно один дочерний элемент ...

Чтобы получить LastWriteTime самого каталога, используйте Get-Item вместо Get-ChildItem.

$dirDate = Get-Item $forDir/$Dir | Select-Object -Expand LastWriteTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...