#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