Powershell - 是否可以避免在字符串中找到字符串

时间:2016-03-03 23:57:59

标签: string powershell powershell-v2.0 select-string

我正在尝试将基于字符串的变量与基于.csv的列表进行比较,以确定字符串是否存在。我忽略了要考虑的是变量可能是其中一个项目列表的子字符串。

在下面的代码片段之前,我提示用户输入名字和姓氏,然后使用提供的信息,执行以下操作以生成8个字符的用户名,然后检查列表以查看如果该用户名可用或已经使用。

$LastName = $objTextBoxLN.text 
$LastName = (Get-Culture).textinfo.totitlecase($LastName)

$UN = $objTextBoxLN.text.Substring(0,[System.Math]::Min(7, $objTextBoxLN.text.Length)).ToLower()+$objTextBoxFN.text.Substring(0,1).ToLower()
Write-Host "Searching for Username Conflicts"
Write-Host 

IF(select-string -Path "c:\Folder_X\userlist.csv" -pattern $UN)
    {
    $UN = $objTextBoxLN.text.Substring(0,[System.Math]::Min(6, $objTextBoxLN.text.Length))+$objTextBoxFN.text.Substring(0,2)
    Write-Host "Conflict found!  Username" $UN.ToLower() "generated using 6 characters from last name plus 2 characters from first name (Option 2)" 
    Write-Host 
ELSE
    {
    Write-Host "No Conflicts Found.  Username" $UN "generated using 7 characters from last name plus 1 character from first name (Option 1)"
    Write-Host
    }

因此,如果在Userlist.csv上我们有一个用户名列表:

  • smithj
  • whitew
  • whitewi
等等......

最终用户输入“Harry Smit”它将生成一个用户名“smith”然后IF语句将在列表中找到“smith”,在当前用户名“smithj”内并将用户名更新为“smithhi” “但这不是我希望实现的行为,我希望它找到用户名”smith“不存在并返回原始用户名。

感谢任何人提供的任何帮助,希望这是一个简单的解决方案。

2 个答案:

答案 0 :(得分:0)

由于每行都有一个,你可以使用正则表达式的开始和结束锚点来强制完全匹配。

$UN = $objTextBoxLN.text.Substring(0,[System.Math]::Min(7, $objTextBoxLN.text.Length)).ToLower()+$objTextBoxFN.text.Substring(0,1).ToLower()

$UN = '^\s*{0}\s*$"' -f $UN

答案 1 :(得分:0)

我建议从查询中获得更合理的输出。如果您可以使用干净的字段分隔符,则可以使用import-csv,并且只检查您感兴趣的列。

import-csv "c:\Folder_X\userlist.csv" -delimiter ' ' -Header @('un','f','l')

un       f       l
--       -       -
"smithj" (John   Smith)
"whitew" (Walter White)
"smith"  (Harry  Smit)

如果你真的无法改变你的输入......
select-string能够匹配正则表达式。将您正在扫描的用户名构建为与您输入的字段格式匹配的正则表达式。

select-string -Path "c:\Folder_X\userlist.csv" -Pattern "^$UN\b"
例如,

这会查找锚定在该行开头的用户名,并紧跟着一个字边界。