PowerShell - [решено] Поиск в csv файле

Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Поиск в csv файле

Сообщение DJ Mogarych »

Код:

Код: Выделить всё

$txt = gc D:\temp\test\Users.txt
[array]$csv = import-csv D:\temp\test\user_list.csv
foreach ($login in $txt) {
    if ($login -notin $csv.samaccountname) {
    $csv += [pscustomobject]@{samaccountname="$login";count="1"}
    }
    else {([double]($csv |? samaccountname -eq "$login").count)++}
}
$csv |export-csv D:\temp\test\user_list.csv -NoTypeInformation
Аватара пользователя
ejik_off

Re: PowerShell - [решено] Поиск в csv файле

Сообщение ejik_off »

DJ Mogarych, спасибо, работает!
Аватара пользователя
ejik_off

Re: PowerShell - [решено] Поиск в csv файле

Сообщение ejik_off »

ejik_off, это потому, что у Вас в примере в csv-файле одна строка. Я всё время забываю, что нужно постоянно отслеживать эти долбаные просчёты в архитектуре милые шалости PowerShell'a.



Замените в том коде эту строку:



Код:

Код: Выделить всё

$sCSVContent = Import-Csv  -Path $sCSVFile

на эту:



Код:

Код: Выделить всё

$sCSVContent = , (Import-Csv  -Path $sCSVFile)
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Поиск в csv файле

Сообщение DJ Mogarych »

А, так вот в чём дело - а я и думаю, почему в csv просто так нельзя было добавить строку, и надо было принудительно указывать, что это массив, а не кастом-объект. В принципе, логично - PS что видит, так и интерпретирует, объект один, так почему это должно быть массивом?
Аватара пользователя
greg zakharov

Re: PowerShell - [решено] Поиск в csv файле

Сообщение greg zakharov »

Цитата DJ Mogarych:



В принципе, логично - PS что видит, так и интерпретирует, объект один, так почему это должно быть массивом?
PowerShell - [решено] Поиск в csv файле




Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.



Ладно, я понимаю, когда совсем нет элементов — тут деваться некуда. Это надо проверять. Так было с незапамятных времён, так и осталось. Но PowerShell теперь к этим двум вариантам добавляет ещё и третий вариант, абсолютно бессмысленный с точки зрения программирования, но который тоже приходится учитывать.



Может быть, в шестой версии, которая у коллеги greg zakharov, это уже не так, и для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях. Дай-то бог. Но у меня, в 5.1, пока что так:



Скрытый текст

[spoiler]Изображение[/spoiler]
Аватара пользователя
greg zakharov

Re: PowerShell - [решено] Поиск в csv файле

Сообщение greg zakharov »

Iska, специально для вас:



Код:

Код: Выделить всё

E:\sandbox
λ $PSVersionTable.PSVersion
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      18362  145
E:\sandbox
λ $c = Import-Csv .\input.txt
E:\sandbox
λ $c.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
E:\sandbox
λ $c[0]
samaccountname count
-------------- -----
ppetrov        1
E:\sandbox
λ $c[0].samaccountname
ppetrov

Тот же результат будет и в шестерке и в семерке.
Аватара пользователя
greg zakharov

Re: PowerShell - [решено] Поиск в csv файле

Сообщение greg zakharov »

Цитата greg zakharov:



И да, вы непременно удалите это сообщение, сославшись на якобы нарушение форумных правил.



Я удалю ваши сообщения, поскольку они явным образом нарушают пункты 3.1 и 3.7
общих правил
форума.
Аватара пользователя
Petya V4sechkin

Re: PowerShell - [решено] Поиск в csv файле

Сообщение Petya V4sechkin »

Цитата Iska:



Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично.
PowerShell - [решено] Поиск в csv файле




А если потребуется не массив, а единственный элемент, сохраняемый с определенным типом? Ситуации бывают разные, иногда, как раз, требуется ограничить данные, чтобы получался на выходе не массив.




Цитата Iska:



А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично.
PowerShell - [решено] Поиск в csv файле




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




Цитата Iska:



И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
PowerShell - [решено] Поиск в csv файле




Всё гораздо проще:

Если требуется таки массив, при любом количестве данных, то необходимо указать тип переменной, либо:






Цитата Iska:



для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях.
PowerShell - [решено] Поиск в csv файле




Командлет, в данном случае, не при чем, так работало:





и продолжает работать автоматическое приведение типов:





И кроме того, есть ведь специальный оператор массива:

The array operator is useful in scripts when you are getting objects, but do not know how many objects you get.




Код:

Код: Выделить всё

$p = @(Get-Process Notepad)

Так что логика, определенно, присутствует... к ней просто надо привыкнуть.
Аватара пользователя
YuS_2

Re: PowerShell - [решено] Поиск в csv файле

Сообщение YuS_2 »

Цитата Iska:



Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
PowerShell - [решено] Поиск в csv файле




Тип не зависит от количества. Практически все командлеты написаны под функциональный стиль использования - они не "возвращают", они выдают результат в первый поток. Это вы своим любимым императивным подходом обращаетесь к неявным преобразованиям типов.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»