是否可以在管道内使用三元运算符?

Is it possible to use a ternary operator inside a pipeline?

我希望根据 $debug 的布尔值将文件和文件夹属性发送到 csv 文件或屏幕。我试图通过在以下管道的末尾包含一个三元运算符来实现这一点:

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 ';'}})

这种方法不好吗?推荐哪种方法?

这会如您所愿。但是,这是处理问题的一种非常奇怪的方式。它很慢,因为它为每个项目执行文件写入,或者如果启用,则为每个项目执行屏幕写入。保存到 $Var 然后写入文件 and/or 屏幕会快得多。 [咧嘴一笑]

此代码将您的最后一行扩展为带有 ifForEach-Object 调用以测试输出目标。它还将 -ErrorAction 添加到 Get-ChildItem 调用以处理 "inaccessible file" 错误。

它还会删除 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