Не удается отобразить экспорт-csv в PoweSshell

#powershell #dictionary #export-csv

#powershell #словарь #экспорт-csv

Вопрос:

Я исследовал Веб, чтобы посмотреть, чего мне не хватает, и не могу выяснить, я запускаю команду, она проходит через список компьютеров, но документ экспорта всегда пуст.

Вот код

     foreach ($computer in Get-Content "\NETWORK PATHuser-computers.txt") {
    Write-host $computer
    $colDrives = Get-WmiObject Win32_MappedLogicalDisk -ComputerName $computer

    $Report = @()

    # Set our filename based on the execution time
    $filenamestring = "$computer-$(get-date -UFormat "%y-%b-%a-%H%M").csv"
    foreach ($objDrive in $colDrives) {
    # For each mapped drive – build a hash containing information
    $hash = @{
    ComputerName = $computer
    MappedLocation = $objDrive.ProviderName
    DriveLetter = $objDrive.DeviceId
    }
    # Add the hash to a new object
    $objDriveInfo = new-object PSObject -Property $hash
    # Store our new object within the report array
    $Report  = $objDriveInfo
    }}
    # Export our report array to CSV and store as our dynamic file name
    $Report | Export-Csv -LiteralPath "\NETWORK PATHDrive-Maps.csv" -NoTypeInformation
  

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

Комментарии:

1. Определите «пустой» — равен ли размер файла (т.е. (Get-Item \NETWORK PATHDrive-Maps.csv).Length ) 0?

Ответ №1:

Я не уверен, почему вы не получаете выходные данные. Я переписал ваш скрипт по нескольким причинам, на которые хотел бы указать. Во-первых, ваше имя переменной не очень понятно. Я предполагаю, что вы пришли из среды VBScripting. Далее вы создаете массив, а затем добавляете к нему — это просто не нужно. Вы можете напрямую записывать выходные данные любого цикла / scriptblock / etc, назначая подобные tihs.

 $Report = foreach($thing in $manythings){Do lots of stuff and everything in stdout will be captured}
  

Если вы напишете свой скрипт таким образом, чтобы использовать преимущества конвейера, вы сможете сделать еще больше. Далее, создание объекта с помощью New-Object происходит медленно по сравнению с использованием [PSCustomObject] ускорителя типов, представленного в версии V3. Наконец, кажется, что вы создаете пользовательский csv для каждого компьютера, но в итоге вы просто экспортируете все в один файл. Я собираюсь предположить, что вы хотите собрать всю эту информацию и поместить в один CSV.

Моя рекомендация для вас, чтобы помочь в устранении неполадок, запустите это на своих компьютерах и подтвердите вывод на экране. Все, что вы видите на экране, должно быть записано в переменной отчета. (Кроме write-host, он специальный и просто выводится на консоль)

 $computerList = "\NETWORK PATHuser-computers.txt"

$reportFile = "\NETWORK PATHDrive-Maps.csv"

Get-Content $computerList | ForEach-Object {
    Write-host $_
    $mappedDrives = Get-WmiObject Win32_MappedLogicalDisk -ComputerName $_

    foreach ($drive in $mappedDrives)
    {
        # For each mapped drive – build a hash containing information
        [PSCustomObject]@{
            ComputerName = $_
            MappedLocation = $drive.ProviderName
            DriveLetter = $drive.DeviceId
        }

    }
} -OutVariable Report
  

Как только вы убедитесь, что у вас есть вся правильная информация, запустите это, чтобы экспортировать ее.

 $Report  | Export-Csv -LiteralPath $reportFile -NoTypeInformation