比较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
运算符,因为该运算符用于检查数组是否包含特定元素。
我想在 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
运算符,因为该运算符用于检查数组是否包含特定元素。