比较foreach中的字符串

时间:2015-08-21 09:29:46

标签: string powershell foreach compare string-comparison

我想在PowerShell中比较2个字符串。一个是实际日期,另一个是从包含大量行的文件中读取的。该行总是包含相同的结构,然后我们可以提取一个子字符串来比较日期。 该文件将是纯文本。日期和子字符串的类型是相同的。

MyProblem: 如果我执行此代码,程序不会写任何内容,即使字符串相同,Write-Host也不会执行。有人能帮助我吗?

$list = Import-Csv C:\file.txt

#actual date
$date  = Get-date -Format d
$day   = $fecha.Substring(0,2)
$month = $fecha.Substring(3,2)
$year  = $fecha.Substring(6,4)
$date  = "$year$month$day"

#I do this because if I use $list will return me an pscustomobject object
$file = Get-Content -Path C:\file.txt

#Use a ForEach loop to process all lines in the source file
foreach ($row in $file) {
  $sub = $entrada.Substring(7,7)

  if ($date-like $sub) {Write-Host "They are equals"}
  if ($sub -Match $date) {Write-Host "They are equals"}
  if ($date.Equals($sub)) {Write-Host "They are equals"}
  if ($date-eq $sub) {Write-Host "They are equals"}
  if ($sub -contains $date) {Write-Host "They are equals"}
}

2 个答案:

答案 0 :(得分:2)

看起来“entrada”和“row”旨在表示相同的数据项。 试试这样:

http:// mydomain.com/myfile.zip

答案 1 :(得分:1)

您的参考日期字符串长度为8个字符,但您从行中提取的字符串只有7个字符,因此您不太可能获得匹配。特别是因为您仔细选择了比较以避免意外匹配。 ;)另外,正如@ arco444在您的问题的评论中指出的那样,循环变量$row永远不会在循环内的任何地方使用。

我建议将代码简化为:

$date = Get-Date -f 'yyyyMMdd'

Get-Content -Path 'C:\file.txt' | Where-Object { $_.Substring(7,8) -eq $date }

这将仅列出输入文件中包含匹配日期的那些行。

另一种选择是在每一行使用Contains()方法:

Get-Content -Path 'C:\file.txt' | Where-Object { $_.Contains($date) }

但是这会在一行中的任何地方找到匹配的日期,而不仅仅是在给定的位置。

我要避免使用通配符(-like)或正则表达式(-match)检查,因为您要比较固定值而不是模式。并且您无法使用-contains运算符,因为该运算符用于检查数组是否包含特定元素。