【发布时间】:2018-12-03 15:09:51
【问题描述】:
我要获取列表
- 文件/文件夹的完整路径名
- 文件/文件夹的最后写入时间
- 文件/文件夹的大小
基于最终用户想要的 3 条信息中的哪一条。 我希望扩展我的这个功能,以根据提供的输入容纳更多属性。下面给出的是我的代码的 sn-p 以及它之后的失败。
-
$Path是路径,是输入 -
$CustomMetaList是一个属性数组,它是一个输入。
$BaseCmd = "Get-ChildItem $Path -Recurse"
$Hidden = ""
$FullName = ""
$LastWriteTime = ""
$Size = ""
$PropList = ""
$CustomMetaList = $CustomMetaList.split(",")
foreach ($Meta in $CustomMetaList) {
if ($Meta -eq "'Hidden'") {
$Hidden = "-Force"
}
if ($Meta -eq "'FullName'") {
$PropList = [String]::Join(",","@{e={`$_.FullName};width=250}")
}
if ($Meta -eq "'LastWriteTimeUtc'") {
$PropList = [String]::Join(",",$PropList,"@{e={`$_.LastWriteTimeUtc -UFormat %s}}")
}
if ($Meta -eq "'Size'") {
$PropList = [String]::Join(",",$PropList,"@{e={`$_.Length}}")
}
}
Invoke-Expression "$BaseCmd $Hidden | Format-Table -HideTableHeaders -Property $PropList -AutoSize | Out-String -Width 5000"
}
当我尝试运行我的脚本时收到以下错误, 你知道出了什么问题吗?
调用表达式: 在行:1 字符:210 + ... stWriteTimeUtc -UFormat %s}},@{e={$_.Length}} -AutoSize |外串宽度 5000 + ~~~~~~~~ 表达式或语句中出现意外的标记“-UFormat”。 在行:1 字符:219 + ... meUtc -UFormat %s}},@{e={$_.Length}} -AutoSize |外串宽度 5000 + ~~ 表达式或语句中出现意外的标记“%s”。 在 E:\299955427760_GetData.ps1:114 char:5 + 调用表达式“$BaseCmd $Hidden | 格式表 -HideTableHeaders -Proper ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException + FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand【问题讨论】:
-
与其构建要运行的命令,为什么不直接运行基本命令,通过
Select-Object发送该命令以构建仅包含所需属性的对象,最后将其发送给Format-Object? ///// 我看不出有任何理由去做……倒退……就像你在那里所做的那样。 [咧嘴] -
@Lee_Dailey 这是我在 ps 新手中看到的一种奇怪的反模式,他们生成一些命令字符串并使用
Invoke-Expression来运行它,而不仅仅是......运行命令字符串。 -
@TheIncorrigible1 - 我想你是对的。 [grin] 希望 OP 能从他的角度描述为什么。
-
感谢@TheIncorrigible1,我会牢记这一点,我的方法背后的基本思想是根据输入(对于名称、大小等属性)将命令构建为字符串lwt) 用户提供。快速在线搜索我想要的东西让我找到了 Invoke-Expression。不过,我没有检查这是否是最好的方法。
标签: powershell