PowerShell:难以导入制表符分隔的文件作为数组

时间:2018-08-11 05:37:43

标签: arrays powershell

我正在尝试构建一个PowerShell脚本,该脚本查找上个月的磁带条形码并将其存储在变量中。从由备份软件生成的制表符分隔的文本文件中读取数据。出于某种原因,PowerShell能够将文件导入为数组,但是我无法根据数据进行过滤。

我将解释:

我遇到的第一个问题是,导出文件的前5行阻止PowerShell将其识别为数组:

#List of Media
#Cell Manager: hpdp.domain.local
#Creation Date: 11/08/2018 9:36:09 AM
# Headers
# Medium ID Label   Location    Status  Protection  Used [MB]   Total [MB]  Last Used   Last Used_t Pool    Type

我能够“修复”此问题的方法是使用记事本删除前四行并从标题行中删除#。该文件如下所示:

Medium ID   Label   Location    Status  Protection  Used [MB]   Total [MB]  Last Used   Last Used_t Pool    Type
id1:id2:id3:id5 [hostname] labelname_31 [Library:     5]    Good    13/08/2018 10:01:41 PM  762699.50   762699.50   14/07/2018 10:00:36 PM  1531828836  Tape Drive Pool LTO-Ultrium

然后我运行以下命令将文件导入为数组:

$Table = Import-Csv $file # "-Delimiter `t" yields the same result


考虑以下结果:

$Table | FT生成一个看起来像源文件的表

$Table | FL生成一个列表,其中所有对象均应显示

$Table | select "Label"列出“标签”列及其下的所有数据。在任何列上执行此操作都会产生应有的列和数据。

$Table | Where-Object {"Last Used" -like '*'}产生与$Table | FL相同的输出



现在,我们要达到我想要达到的目标,而无法正常工作的部分:

我要查找和存储“上次使用”日期为上个月的Label对象。但是,当我执行以下操作时:

$Table | Where-Object {"Last Used" -like '*/07*'}

我没有结果。

运行此命令时:

$Table | Where-Object {"Last Used" -is '2/07/2018 7:36:28 PM'}

我有很多这样的东西:

Cannot convert the "2/07/2018 7:36:28 PM" value of type "System.String" to type "System.Type".
At line:1 char:24
+ $Table | Where-Object {"Last Used" -is '2/07/2018 7:36:28 PM'}
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

Cannot convert the "2/07/2018 7:36:28 PM" value of type "System.String" to type "System.Type".
At line:1 char:24
+ $Table | Where-Object {"Last Used" -is '2/07/2018 7:36:28 PM'}
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

任何人都可以分享我在做错事情时的智慧吗?预先感谢!

1 个答案:

答案 0 :(得分:1)

 $Table | Where-Object {"Last Used" -like '*/07*'}

正在寻找*/07*,如单引号所示。双引号会更好。反斜杠可以避免任何奇怪的字符,例如正斜杠,除非它具有含义

$Table | Where-Object {"Last Used" -like "*\/07*"}

我还要指出“上次使用”的位置。 $ _表示管道输入的对象

$Table | Where-Object {$_."Last Used" -like "*\/07*"}

最后,将-is替换为-eq,这是系统类型错误的来源。 (请阅读this,以获取有关-is与-eq的更多信息)-contains和-ccontains也会有所帮助

$Table | Where-Object {$_."Last Used" -eq '2/07/2018 7:36:28 PM'}

另一个提示。避免使用管道,否则会增加大量处理量。这与上述相同,但快了许多倍。特别是在打开文件时。管道等待上一个命令完成而不是方法来完成其工作。有一种方法可以做到这一点。跳过不必要的处理。换句话说,管道将强制在哪里读取每一行,该方法将仅在兼容的行上激活。如果您想测试它,可以使用measure-command {command to measure here}

$Table.where({$_."Last Used" -eq '2/07/2018 7:36:28 PM'})