Ошибки с Get-ChildItem, пытающимся сканировать сеть для всех файлов .mdb - PullRequest
0 голосов
/ 31 января 2019

Я очень плохо знаком с использованием powershell и пытаюсь выполнить сценарий, который сканирует всю сеть, например, на наличие всех файлов .mdb и .accdb, и создает электронную таблицу, содержащую данные о них, которые я обрабатываю в другом месте.

Я поместил важные данные, которые я не хотел предоставлять, в () s

Вот мой код:

#single threaded
import-module activedirectory

$arr = @()

$computers = Get-ADComputer -filter 'name -like "(employee computers)*"'  | Select -Exp Name

foreach ($computer in $computers) {
Write-Host "Scanning" $computer "..."
gci \\$computer\c$\* -Include *.mdb, *.accdb -Recurse | ? {$_.PSIsContainer -eq $False} | % {
$obj = New-Object PSObject
$obj | Add-Member NoteProperty Directory $_.DirectoryName
$obj | Add-Member NoteProperty Name $_.Name
$obj | Add-Member NoteProperty FullName $_.FullName
$obj | Add-Member NoteProperty Size $_.Length
$obj | Add-Member NoteProperty CreationTime $_.CreationTime
$obj | Add-Member NoteProperty LastWriteTime $_.LastWriteTime

$arr += $obj
Write-Host "Scanning..." 
}}

$arr | Export-CSV -notypeinformation '(path)\EmployeeDBs.csv'

До сих пор это работало довольно хорошо, но навернякамашины и / или каталоги на некоторых машинах Я получаю следующие сообщения об ошибках:

Get-ChildItem : The specified network name is no longer available

[Get-ChildItem], IOException
    + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

и

Get-ChildItem : An object at the specified path \\(employee computer)\c$ does not exist.

[Get-ChildItem], IOException
    + FullyQualifiedErrorId : ItemDoesNotExist,Microsoft.PowerShell.Commands.GetChildItemCommand

Я гуглял, но не очень повезло в понимании этих сообщений об ошибках,Может ли кто-нибудь объяснить, что это за проблемы?

Я думаю (надеюсь), что это проблемы с разрешениями, потому что я тестирую сценарии на своем персональном компьютере, прежде чем запускать их с компьютера администратора

Любое понимание очень ценится!

РЕДАКТИРОВАТЬ: ниже мой отредактированный код для асинхронного выполнения:

import-module activedirectory

$computers = Get-ADComputer -filter 'name -like "wa-150*"'  | Select -Exp Name


Get-job | Remove-Job -Force
Remove-Item -path (path)\EmployeeDBs.txt

foreach ($computer in $computers) {
    $scriptBlock = {gci \\$($args[0])\c$\Users\z*\Desktop\* -Include *.mdb, *.accdb -Recurse | ? {$_.PSIsContainer -eq $False} | % {
        $obj = New-Object PSObject
        $obj | Add-Member NoteProperty Directory $_.DirectoryName
        $obj | Add-Member NoteProperty Name $_.Name
        $obj | Add-Member NoteProperty Size $_.Length
        $obj | Add-Member NoteProperty CreationTime $_.CreationTime
        $obj | Add-Member NoteProperty LastWriteTime $_.LastWriteTime
        Write-Output -InputObject $obj
        }
    }

    while ((Get-Job -State Running).Count -ge 20) {
        Write-Host "Full - Waiting ... "
      Start-Sleep -Seconds 5;
    }

    Start-Job -name $computer -ScriptBlock $scriptBlock -ArgumentList $computer
    #Invoke-Command -ScriptBlock $scriptBlock -ArgumentList $computer

}
Get-Job | Wait-Job | Receive-Job | Out-File -Append -FilePath '(path)\EmployeeDBs.txt'
Write-Host "Done"
...