比较foreach中的字符串

Comparing strings inside of foreach

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

我的问题: 如果我执行此代码,程序不会写入任何内容,即使字符串相同,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"}
}

看起来 "entrada" 和 "row" 是指同一个数据项。 像这样尝试:

$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 ($entrada 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"}
}

您的参考日期字符串长度为 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 运算符,因为该运算符用于检查数组是否包含特定元素。