我正在尝试构建一个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
任何人都可以分享我在做错事情时的智慧吗?预先感谢!
答案 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'})