Powershell 意外标记'-UFormat';在表达或陈述中

Powershell 意外标记'-UFormat';在表达或陈述中,powershell,Powershell,我在找你的名单 文件/文件夹的完整路径名 文件/文件夹的上次写入时间 文件/文件夹的大小 基于最终用户想要的3条信息中的哪一条。 我希望根据提供的输入扩展我的这个功能,以适应更多的属性。下面给出的是我的代码片段和失败 $Path是一个路径,它是一个输入 $CustomMetaList是一个属性数组,它是一个输入 $BaseCmd=“Get ChildItem$Path-递归” $Hidden=“” $FullName=“” $LastWriteTime=“” $Size=“” $Prop

我在找你的名单

  • 文件/文件夹的完整路径名
  • 文件/文件夹的上次写入时间
  • 文件/文件夹的大小
基于最终用户想要的3条信息中的哪一条。 我希望根据提供的输入扩展我的这个功能,以适应更多的属性。下面给出的是我的代码片段和失败

  • $Path
    是一个路径,它是一个输入
  • $CustomMetaList
    是一个属性数组,它是一个输入
$BaseCmd=“Get ChildItem$Path-递归”
$Hidden=“”
$FullName=“”
$LastWriteTime=“”
$Size=“”
$PropList=“”
$CustomMetaList=$CustomMetaList.split(“,”)
foreach($CustomMetaList中的Meta){
如果($Meta-eq“隐藏”){
$Hidden=“-Force”
}
如果($Meta-eq“'FullName'”){
$PropList=[String]::Join(“,”,“@{e={`$\.FullName};width=250}”)
}
if($Meta-eq“'LastWriteTimeUtc'”){
$PropList=[String]::Join(“,”,$PropList,“@{e={`$\.LastWriteTimeUtc-UFormat%s}”)
}
如果($Meta-eq“大小”){
$PropList=[String]:Join(“,”,$PropList,“@{e={`$\.Length}}”)
}
}
调用表达式“$BaseCmd$Hidden | Format Table-HideTableHeaders-PropList-AutoSize | Out String-Width 5000”
}
我在尝试运行脚本时收到以下错误, 你知道怎么了吗

Invoke-Expression : At line:1 char:210 + ... stWriteTimeUtc -UFormat %s}},@{e={$_.Length}} -AutoSize | Out-String -Width 5000 + ~~~~~~~~ Unexpected token '-UFormat' in expression or statement. At line:1 char:219 + ... meUtc -UFormat %s}},@{e={$_.Length}} -AutoSize | Out-String -Width 5000 + ~~ Unexpected token '%s' in expression or statement. At E:\299955427760_GetData.ps1:114 char:5 + Invoke-Expression "$BaseCmd $Hidden | Format-Table -HideTableHeaders -Proper ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException + FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand 调用表达式: 第1行字符:210 + ... stWriteTimeUtc-UFormat%s},@{e={$\u0.Length}-AutoSize | Out String-Width 5000 + ~~~~~~~~ 表达式或语句中出现意外标记'-UFormat'。 第1行字符:219 + ... meUtc-UFormat%s},@{e={$\长度}}-AutoSize | Out String-Width 5000 + ~~ 表达式或语句中出现意外标记“%s”。 在E:\299955427760_GetData.ps1:114 char:5 +调用表达式“$BaseCmd$Hidden | Format Table-HideTableHeaders-property…”。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:ParserError:(:)[Invoke Expression],ParseException +FullyQualifiedErrorId:意外终止,Microsoft.PowerShell.Commands.InvokeeExpressionCommand 正如可靠的建议,因为几乎总是有更好的解决方案,并且伴随着安全风险

通常,对于迭代构造具有不同参数的命令,参数是最好的解决方案,但在您的情况下,这并不是严格必要的-请参阅底部部分

但是,您的问题与使用
调用表达式无关,因为正是以下表达式导致了您的问题:

$_.LastWriteTimeUtc -UFormat %s  # !! Syntax error
只能将
-UFormat
传递给
Get Date
cmdlet,而不能传递给变量或表达式:

Get-Date -Date $_.LastWriteTimeUtc -UFormat %s  # OK
此外,由于Windows PowerShell v.5.1中的一个错误(自在PowerShell Core中更正后),
获取日期-UFormat%s
也会输出分数秒,这是不正确的;您只需将其转换为
[int]
,即可解决此问题:

[int] (Get-Date -Date $_.LastWriteTimeUtc -UFormat %s)
(如果
Get Date-UFormat
始终输出字符串,即使没有bug,您也可能希望这样做以接收数字结果)

顺便提一下:另一个错误导致结果默认基于本地时间,而Unix时间戳要求基于UTC;因为您使用的是属性
。LastWriteTimeUtc
,所以您的代码不受影响


这里有一个解决方案,它避免了
调用表达式
,而且更短:

# Sample input values.
$Path = $env:TEMP
$CustomMetaList = 'FullName,Size,LastWriteTimeUtc'

# Construct the array of property definitions to pass to Select-Object
# based on the custom list, and record in $force whether hidden items 
# should be included.
$props = switch ($CustomMetaList -split ',') {
    'Hidden' { $force = $True; continue } # save in Boolean var.
    'FullName' { $_; continue }           # same name as property
    'Size' { 'Length'; continue }         # map 'Size' to 'Length'
    'LastWriteTimeUtc' {                  # calculated property
      @{ n=$_; e = { [int] (Get-Date -Date $_.LastWriteTimeUtc -UFormat %s) } }
    }
}


Get-ChildItem $Path -Recurse -Force:$force | 
  Format-Table -Property $props -HideTableHeaders -AutoSize |
    Out-String -Width 5000
请注意如何使用
开关
隐式迭代
$CustomMetaList-split',
返回的数组元素。 默认情况下,
switch
语句的分支处理程序都会进行测试,因此一旦找到匹配项,
continue
用于短路。警告:不要使用
break
,因为它会停止对更多数组元素的迭代

开关
语句迭代的输出隐式收集在存储在
$props
中的数组中,该数组随后被传递到
格式表

-Force:$Force
是一种模拟通过/不通过开关参数的效果的方法
-Force
:如果
$Force
$true
,则与刚刚通过
-Force
相同;否则,它被视为未通过
-Force

这将产生如下结果:

FullName                              Length LastWriteTimeUtc
--------                              ------ ----------------
C:\path\to\sample.txt                 51     1543853694
# ...
正如可靠的建议,因为几乎总是有更好的解决方案,并且伴随着安全风险

通常,对于迭代构造具有不同参数的命令,参数是最好的解决方案,但在您的情况下,这并不是严格必要的-请参阅底部部分

但是,您的问题与使用
调用表达式无关,因为正是以下表达式导致了您的问题:

$_.LastWriteTimeUtc -UFormat %s  # !! Syntax error
只能将
-UFormat
传递给
Get Date
cmdlet,而不能传递给变量或表达式:

Get-Date -Date $_.LastWriteTimeUtc -UFormat %s  # OK
此外,由于Windows PowerShell v.5.1中的一个错误(自在PowerShell Core中更正后),
获取日期-UFormat%s
也会输出分数秒,这是不正确的;您只需将其转换为
[int]
,即可解决此问题:

[int] (Get-Date -Date $_.LastWriteTimeUtc -UFormat %s)
(如果
Get Date-UFormat
始终输出字符串,即使没有bug,您也可能希望这样做以接收数字结果)

顺便提一下:另一个错误导致结果默认基于本地时间,而Unix时间戳要求基于UTC;因为您使用的是属性
。LastWriteTimeUtc
,所以您的代码不受影响


这里有一个解决方案可以避免
调用表达式