Можно ли использовать троичный оператор внутри конвейера? - PullRequest
0 голосов
/ 24 октября 2019

Я хочу отправить атрибуты файла и папки либо в файл CSV, либо на экран в зависимости от логического значения $ debug. Я попытался сделать это, включив троичный оператор в конец следующего конвейера:

Get-ChildItem $directory -Recurse -File |
    Select-Object @{name='Folder_Name';expression={$($_.directoryname)}},
                  @{name='File_type';expression={$($_.extension)}},
                  @{name='File_name';expression={$($_.name)}},
                  @{name='File_size_bytes';expression={$($_.length)}},
                  @{name='Creation_datetime';expression={$($_.creationtime)}},
                  @{name='Last_update_datetime';expression={$($_.lastwritetime)}},
                  @{name='Last_read_datetime';expression={$($_.lastaccesstime)}} |
                  (&{if ($debug) {Write-Host} else {Export-Csv -path $outpath -NoTypeInformation -force -Delimiter ';'}})

Это плохой подход, и какой подход рекомендуется?

1 Ответ

1 голос
/ 24 октября 2019

это будет делать то, что вы хотите. однако, это ДЕЙСТВИТЕЛЬНО странный способ справиться с проблемой. он МЕДЛЕННЫЙ, так как он выполняет запись в файл для каждого элемента ИЛИ запись в экран для каждого элемента, если он включен. сохранение в $ Var и последующая запись в файл и / или на экран будет намного быстрее . [ ухмылка ]

этот код расширяет вашу последнюю строку в вызов ForEach-Object с if для проверки выходного адреса. он также добавляет -ErrorAction к вызову Get-ChildItem для обработки ошибок «недоступный файл».

также удаляет ненужные $() в строках expression =.

$directory = $env:TEMP
$outpath = "$env:TEMP\GustavRasmussen.csv"

# uncomment the 2nd line to test the negative
$ToScreen = $True
#$ToScreen = $False

Get-ChildItem $directory -Recurse -File -ErrorAction SilentlyContinue |
    Select-Object @{name='Folder_Name';expression={$_.directoryname}},
                  @{name='File_type';expression={$_.extension}},
                  @{name='File_name';expression={$_.name}},
                  @{name='File_size_bytes';expression={$_.length}},
                  @{name='Creation_datetime';expression={$_.creationtime}},
                  @{name='Last_update_datetime';expression={$_.lastwritetime}},
                  @{name='Last_read_datetime';expression={$_.lastaccesstime}} |
    ForEach-Object {
        if ($ToScreen)
            {
            $_
            }
            else
            {
            Export-Csv -InputObject $_ -path $outpath -NoTypeInformation -force -Delimiter ';' -Append
            }
        }

первые три строки CSV ...

"Folder_Name";"File_type";"File_name";"File_size_bytes";"Creation_datetime";"Last_update_datetime";"Last_read_datetime"
"C:\Temp";".tmp";"DELCD3A.tmp";"861968";"2019-07-13 11:43:18 PM";"2019-07-13 11:42:36 PM";"2019-07-13 11:43:18 PM"
"C:\Temp";".txt";"FXSAPIDebugLogFile.txt";"0";"2015-11-03 6:54:02 PM";"2015-11-03 6:54:02 PM";"2015-11-03 6:54:02 PM"
"C:\Temp";".log";"Genre-List_2019-10-01.log";"178";"2019-10-01 12:33:47 PM";"2019-10-01 12:33:47 PM";"2019-10-01 12:33:47 PM"

первые три строки вывода на экран ...

Folder_Name          : C:\Temp
File_type            : .tmp
File_name            : DELCD3A.tmp
File_size_bytes      : 861968
Creation_datetime    : 2019-07-13 11:43:18 PM
Last_update_datetime : 2019-07-13 11:42:36 PM
Last_read_datetime   : 2019-07-13 11:43:18 PM

Folder_Name          : C:\Temp
File_type            : .txt
File_name            : FXSAPIDebugLogFile.txt
File_size_bytes      : 0
Creation_datetime    : 2015-11-03 6:54:02 PM
Last_update_datetime : 2015-11-03 6:54:02 PM
Last_read_datetime   : 2015-11-03 6:54:02 PM

Folder_Name          : C:\Temp
File_type            : .log
File_name            : Genre-List_2019-10-01.log
File_size_bytes      : 178
Creation_datetime    : 2019-10-01 12:33:47 PM
Last_update_datetime : 2019-10-01 12:33:47 PM
Last_read_datetime   : 2019-10-01 12:33:47 PM
...