Ошибка Powershell при попытке создать CSV (пустые значения) - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь создать сценарий для возврата CSV-списка всех файлов .exe и .dll, хранящихся в папке, с указанием их имени, размера и версии.

Для этого я использую этот сценарий:

$path = 'C:\MyFolder'
Get-ChildItem -Path $path * -include *.dll,*.exe -Recurse |
Select-Object @{Name = 'Name'; Expression = {$_.Name}},
              @{Name = 'Size'; Expression = {$_.Length}},
              @{Name = 'Modified'; Expression = {$_.LastWriteTime}},
              @{Name = 'ProductVersion'; Expression = {($_.VersionInfo.ProductVersion.ToString())}} 

# output on screen
$result | Format-Table -AutoSize

# csv file
$result | Export-Csv -Path 'C:\Users\me\Downloads\softwareVersions.csv' -NoTypeInformation

К сожалению, некоторые из моих файлов не имеют версии, поэтому на экране я просто вижу пустое значение в столбце «ProductVersion», но из-за этого я могу Не сгенерировал свой CSV, я получаю сообщение об ошибке:

Export-Csv : Cannot bind argument to parameter 'InputObject' because it is null

Я попытался заменить соответствующую строку (ту, которая имеет версию, которую я предполагаю), чтобы попытаться заменить версию на «Недоступно», если эта информация не найден, но я новичок в коде Powershell, и он не работает ... Вот что я пробовал:

@{Name = 'ProductVersion'; Expression = if(!!$_.VersionInfo.ProductVersion) {'Not available'}else{($_.VersionInfo.ProductVersion)}}

Я надеюсь, что у вас есть вся необходимая информация, так как я м здесь, чтобы попросить вашей помощи, мастера кода: -)

Заранее спасибо за ваше время и ваш ответ !!

Jerome

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Оба iRon и pwnd sh верны.

Вам необходимо зафиксировать результат всего блока кода, начиная с Get-ChildItem, в переменной позвонил $result. Затем вы можете либо показать все, что есть на экране, либо сохранить его как соответствующий CSV-файл.

Кроме того, при тестировании на Not Something вы можете использовать один восклицательный знак ! или оператор -not. Когда вы удваиваете это, вы отрицаете отрицание, поэтому в этом случае я бы предложил просто проверить на if Something, do this, else do that, чтобы избежать путаницы:

$path   = 'C:\MyFolder'
$result = Get-ChildItem -Path $path -Filter '*' -Include '*.dll','*.exe' -Recurse |
          Select-Object @{Name = 'Name'; Expression = {$_.Name}},
                        @{Name = 'Size'; Expression = {$_.Length}},
                        @{Name = 'Modified'; Expression = {$_.LastWriteTime}},
                        @{Name = 'ProductVersion'; Expression = {
                            if ($_.VersionInfo.ProductVersion) {
                                $_.VersionInfo.ProductVersion.ToString()
                            }
                            else {
                                'Not available'
                            }}
                       }

# output on screen
$result | Format-Table -AutoSize

# csv file
$result | Export-Csv -Path 'C:\Users\me\Downloads\softwareVersions.csv' -NoTypeInformation
0 голосов
/ 17 июня 2020

Вы почти сделали это самостоятельно;)

Просто удалите один восклицательный знак (!) В своем выражении. Вы ввели два.

"!!" отрицает его дважды, что равносильно его не отрицанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...