我可以格式化Get-Datecmdlet没有这样的问题:
$date = Get-Date -format "yyyyMMdd"
Run Code Online (Sandbox Code Playgroud)
但是一旦我在变量中得到了一个日期,我该如何格式化呢?以下声明
$dateStr = $date -format "yyyMMdd"
Run Code Online (Sandbox Code Playgroud)
返回此错误:
"你必须在'-f'运算符的右侧提供一个值表达式"
# array
C:\> (1,2,3).count
3
C:\> (1,2,3 | measure).count
3
# hashtable
C:\> @{1=1; 2=2; 3=3}.count
3
C:\> (@{1=1; 2=2; 3=3} | measure).count
1
# array returned from function
C:\> function UnrollMe { $args }
C:\> (UnrollMe a,b,c).count
3
C:\> (UnrollMe a,b,c | measure).count
1
C:\> (1,2,3).gettype() -eq (UnrollMe a,b,c).gettype()
True
Run Code Online (Sandbox Code Playgroud)
与HashTables的差异是众所周知的,尽管官方文档仅提到它(通过示例).
但是,功能问题对我来说是个新闻.我有点震惊,现在还没有咬过我.我们编程人员可以遵循一些指导原则吗?我知道在C#中编写cmdlet时会出现WriteObject的重载,您可以在其中明确地控制枚举,但是AFAIK在Posh语言本身中没有这样的构造.正如最后一个例子所示,Posh解释器似乎相信被管道对象的类型没有区别.我怀疑在引擎盖下可能会有一些Object vs PSObject的怪异,但是当你编写纯粹的Posh并期望脚本语言"正常工作"时,这没什么用处.
/编辑/
基思是正确的指出,在我的例子中,我传入一个字符串[]参数而不是3个字符串参数.换句话说,Measure-Object说Count = 1的原因是因为它看到的是一个数组,其第一个元素是@("a","b","c").很公平.这些知识允许您以多种方式解决问题:
# stick to single objects
C:\> (UnrollMe a b c | measure).count
3 …Run Code Online (Sandbox Code Playgroud)