是否可以在管道内使用三元运算符?
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 屏幕会快得多。 [咧嘴一笑]
此代码将您的最后一行扩展为带有 if
的 ForEach-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
我希望根据 $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 屏幕会快得多。 [咧嘴一笑]
此代码将您的最后一行扩展为带有 if
的 ForEach-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