【问题标题】:Forcing the date format in a powershell DIR listing在 powershell DIR 列表中强制使用日期格式
【发布时间】:2020-09-13 23:16:35
【问题描述】:

我正在尝试编写一个增强的目录实用程序(在 python 中),它对通过命令提示符DIR 命令获得的许多目录列表进行后处理。问题是我需要 YYYY-MM-DD HH:MM:SS 特定不可知格式的日期时间输出。

DIR 给我:

27-Apr-17  06:18 p.m.                56 cq.bat
27-Apr-17  06:13 p.m.                27 cqr.bat
27-Apr-17  06:15 p.m.                69 cqu.bat
06-Jul-16  08:43 a.m.               164 cr.bat
15-Jun-16  12:35 p.m.                36 crb.bat
26-Mar-16  01:41 p.m.               102 cru.bat
25-May-16  04:11 p.m.                62 ct.bat
07-Mar-16  07:48 a.m.                71 ctr.bat

患有以下疾病:

  • 没有秒数
  • PC 或区域设置之间的日期时间宽度不一定是固定的。

同样powershell dir 给我:

-a----       27-Apr-17  6:13 p.m.             27 cqr.bat
-a----       27-Apr-17  6:15 p.m.             69 cqu.bat
-a----       06-Jul-16  8:43 a.m.            164 cr.bat
-a----      15-Jun-16  12:35 p.m.             36 crb.bat
-a----       26-Mar-16  2:41 p.m.            102 cru.bat
-a----       25-May-16  4:11 p.m.             62 ct.bat
-a----       07-Mar-16  8:48 a.m.             71 ctr.bat

这对我来说有类似的问题,但我认为 powershell 在日期格式部门可能会更灵活一些。

我宁愿不必保存/弄乱/恢复 PC 的日期格式字符串。

期望的输出是:

2017-04-27 18:13:12             27 cqr.bat
2017-04-27 18:15:33             69 cqu.bat
2016-07-06  8:43:53            164 cr.bat
2016-06-15 12:35:22             36 crb.bat
2016-03-26 14:41:53            102 cru.bat
2016-05-25 16:11:44             62 ct.bat
2016-03-07  8:48:23             71 ctr.bat

【问题讨论】:

    标签: windows powershell date date-formatting


    【解决方案1】:

    您可以使用计算属性和 ToString() 方法

    Get-ChildItem $somepath | Select-Object @{n='LastWriteTime';e={$_.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")}},Length,Name
    

    这将为您提供您指定的 3 列。您还可以利用natural line breaks 来提高可读性。

    Get-ChildItem $somepath |
        Select-Object @{n='LastWriteTime';e={$_.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")}},
                      Length,
                      Name
    

    【讨论】:

    • 感谢您回复@Doug。命令:powershell Get-ChildItem "*.txt" ^| Select-Object @{n='LastWriteTime';e={$_.LastWriteTime -f \"YYYY-MM-DD HH:MM:SS\"}},Length,Name 给了我正确的文件,但日期格式字符串似乎被忽略了11/13/2019 18:13:18 1633766 file.txt
    • 另外(这真的很奇怪)有时输出中的大小字段会从右对齐切换到左对齐!
    • 日期格式字符串应为yyyy-MM-dd HH:mm:ss。外壳在这里很重要!
    • @DougMaurer 这取决于系统区域设置中的设置。在我的荷兰机器上'{0:YYYY-MM-DD HH:MM:SS}' -f (Get-Date) 返回YYYY-09-DD 17:09:SS'{0:yyyy-MM-dd HH:mm:ss}' -f (Get-Date) 返回正确的格式:2020-09-15 17:10:15
    • @DougMaurer 另外,$_.LastWriteTime -f "YYYY-MM-DD HH:MM:SS" 不是 -f 格式运算符的工作方式。你可以把它改成$_.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")
    【解决方案2】:

    如上所述,日期格式区分大小写(即M 表示月份,而m 表示分钟)。

    要使用 -f 格式运算符对此计算属性,您需要设置模板字符串来格式化要插入其中的属性。

    试试

    Get-ChildItem 'ThePath' |
    Select-Object @{n='LastWriteTime';e={'{0:yyyy-MM-dd HH:mm:ss}' -f $_.LastWriteTime}}, Length, Name
    

    【讨论】:

    • 谢谢。日期格式现在是正确的,但显然我需要更详细地研究 PS 格式。我需要严格的格式以简化对输出的解析,而如果它超过 8 个字符,您的答案中的格式似乎可以证明它是合理的。同样,我看到了名称被截断并添加省略号的实例,但目前我无法重现它。如何在 10 个空格内右对齐文件大小?
    • @rossmcm 它不是左对齐的,这只是 PowerShell 默认在控制台中格式化表格输出的方式。如果 Length 有很多位数,则使用该列的整个字段宽度,使其看起来像左对齐。您可以尝试添加| -AutoSize,但是对于长文件名,它不适合控制台宽度,然后这些行会被省略号截断。否则,您可能会更喜欢通过管道传输到 | Out-GridView 时的输出,因为这是一个具有相当大列的新图形窗口。
    • 那么我如何将文件大小作为整数获取并用(比如)格式说明符“%10d”将其写出——这就是我输出整数右对齐 in10 个空格的方式(在 Python 或 Delphi 中)。
    • @rossmcm Length 属性一个整数。如果您希望右对齐最多 10 个字符,您可以通过创建另一个计算属性来做到这一点:@{n='Size';e={ "$_.Length".PadLeft(10) }}@{n='Size';e={ '{0,10}' -f $_.Length }}
    猜你喜欢
    • 2018-01-24
    • 2020-04-30
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多