Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] PS 5.0 модуль AD экспорт в эксель, в том же виде как в консоле (http://forum.oszone.net/showthread.php?t=330427)

zero273 11-10-2017 19:31 2769873

PS 5.0 модуль AD экспорт в эксель, в том же виде как в консоле
 
у нас есть переменная в которой три связанных списка данных.
Код:

$Name =(get-ADUser -Filter {Enabled -eq "True"} -properties $ADProperties `
    | select-object name,samaccountname,@{n="AD_SNILS";e={$_  `
    |Select-Object -ExpandProperty $ADProperties  `
    | select-string $AD_SNILS}})

создаем документ excel, здесь все окей
Код:

$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $true
$WorkBook = $Excel.Workbooks.Add()
$sh1 = $WorkBook.Worksheets.Item(1)
$sh1.Name = "$AD_SNILS"
 
 
# fill cells
$sh1.Cells.Item(1,1) = "кто"                       
$sh1.Cells.Item(1,2) = "Логин"
$sh1.Cells.Item(1,3) = "Снилс"


а вот эта часть кода в идеале должна переносить данные переменной $name в соответствующие столбцы в эксель, что и происходит, но при этом получается что каждый список выгружается без привязки к значениям других списков + некоторые данные пропускаются, например пустые строчки. В итоге данные в консоле не соответствуют данным в экселе.
Код:

$j = 2
    foreach($arr in $Name.name)
    {
    $sh1.Cells.Item($j,1) = "$arr"
    $j++
    }
$j = 2
    foreach($arr in $Name.samaccountname)
    {
    $sh1.Cells.Item($j,2) = "$arr"
    $j++
    }
$j = 2
    foreach($arr in $Name.AD_SNILS)
    {
    $sh1.Cells.Item($j,3) = "$arr"
    $j++
    }


Kazun 12-10-2017 08:49 2769943

Код:

$j = 2
foreach($arr in $Name)
{
    $sh1.Cells.Item($j,1) = $arr.name
    $sh1.Cells.Item($j,2) = $arr.samaccountname
    $sh1.Cells.Item($j,3) = $arr.AD_SNILS
    $j++
}


zero273 13-10-2017 15:09 2770309

эта часть кода отработала отлично
Код:

$sh1.Cells.Item($j,1) = $arr.name
    $sh1.Cells.Item($j,2) = $arr.samaccountname

здесь появилась ошибка
Код:

$sh1.Cells.Item($j,3) = $arr.AD_SNILS
вот такая
Код:

Исключение из HRESULT: 0x800A03EC
At line:1 char:1
+ $sh1.Cells.Item($j,3) = $arr.AD_SNILS
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

оказалось, что PS ругался на пустые строки,заработало после того, как переписал последнюю строчку вот так
Код:

$sh1.Cells.Item($j,3) = "qqq"+$arr.AD_SNILS
остался вопрос как удалить из столбца в эксель "qqq" перед каждым значением :),
нагуглил команды get-content и -replace но применить их по отношению к экселю пока не знаю как.

Iska 13-10-2017 15:24 2770311

Цитата:

Цитата zero273
оказалось, что PS ругался на пустые строки, »

Ой ли. Это явно не «пустая строка».

Цитата:

Цитата zero273
здесь появилась ошибка
Код:

$sh1.Cells.Item($j,3) = $arr.AD_SNILS
вот такая
Код:

Исключение из HRESULT: 0x800A03EC
At line:1 char:1
+ $sh1.Cells.Item($j,3) = $arr.ADSNILS
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : OperationStopped: (:) [], COMException
 + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

оказалось, что PS ругался на пустые строки,заработало после того, как переписал последнюю строчку вот так
Код:

$sh1.Cells.Item($j,3) = "qqq"+$arr.AD_SNILS
»

«AD_SNILS» и «ADSNILS»?!

Цитата:

Цитата zero273
остался вопрос как удалить из столбца в эксель "qqq" перед каждым значением , »

Я бы попробовал как раз пустую строку:
Код:

$sh1.Cells.Item($j,3) = ""+$arr.AD_SNILS
Или проверку типа/содержимого значения.

zero273 13-10-2017 16:32 2770324

Цитата:

«AD_SNILS» и «ADSNILS»?!
опечатался, везде AD_SNILS

Цитата:

Ой ли. Это явно не «пустая строка».
Не буду спорить с высоты моего недельного опыта в программировании))). Это было отличием которое я заметил между AD_SNILS и другими столбцами, когда выводил значение переменной $Name.


такой вариант работает, спасибо.
Код:

$sh1.Cells.Item($j,3) = ""+$arr.AD_SNILS

Iska 13-10-2017 16:41 2770326

zero273, тут надо отличать пустую строку и отсутствующее значение свойства. Как уж оно там отражается в типах — Empty, Null или ещё как — не знаю, смотреть мне не на чем. Важно, что при конкатенации его с пустой строкой происходит преобразование в тип «Строка», хотя ещё лучше бы было проверять содержимое и вовсе не задействовать присваивание «$sh1.Cells.Item($j,3) = …». Мне, опять же — не на чем.

zero273 13-10-2017 17:26 2770341

Цитата:

хотя ещё лучше бы было проверять содержимое и вовсе не задействовать присваивание «$sh1.Cells.Item($j,3) = …»
пока что знаний не хватает, что бы выбирать каким способом делать. Закончу скрипт, с помощью гугла и добрых людей с форума, а после этого примусь за изучение языка последовательно, с основ. Не задумывался, что Empty, Null, воспринимаются программой по разному, принял к сведению.


Время: 03:46.

Время: 03:46.
© OSzone.net 2001-