在 Powershell 脚本中使用正斜杠查找字符串中的子字符串
Finding substring in string with forward slash in Powershell scripts
我正在尝试使用 powershell 脚本在字符串中查找子字符串。实际上,我正在逐行读取一个包含数千条路径的文件。我正在过滤来自文件的每个路径。路径过滤器正在查找路径中的子字符串。
但是当子字符串为 Sroot
或 TRoot
时,Contains
函数 returns 为 false。
以下是我的示例代码。
foreach($line in Get-Content $filePath)
{
# Line can contain
# $line = $/Patil/TEMP/PRoot/Digvijay/Patil/1.png
# $line = $/Patil/TEMP/SRoot/Digvijay/Patil/2.png
# $line = $/Patil/TEMP/TRoot/Digvijay/Patil/3.png
if($line)
{
if($line.Contains('RRoot')) # This condition works properly
{
# Process Rroot here
}
if($line.Contains('SRoot')) # This condition fails.
{
# Process SRoot here
}
if($line.Contains('TRoot')) # This condition fails.
{
# Process TRoot here
}
}
}
输入文件如下:
$/Patil/TEMP/PRoot/Digvijay/Patil/1.png
$/Patil/TEMP/SRoot/Digvijay/Patil/2.png
$/Patil/TEMP/TRoot/Digvijay/Patil/3.png
$/Patil/TEMP/WRoot/Digvijay/Patil/3.png
我试过你的代码,它按预期工作(将 $line.Contains('RRoot')
更改为 $line.Contains('PRoot'
)以匹配输入示例)。
我认为您可能正在努力解决区分大小写的问题。
我建议您尝试将 tolower()
函数应用于字符串,然后与小写字符串进行比较:
foreach($line in Get-Content $filePath)
{
# Line can contain
# $line = P:/TEMP/PRoot/Digvijay/Patil/1.png
# $line = S:/TEMP/SRoot/Digvijay/Patil/2.png
# $line = T:/TEMP/TRoot/Digvijay/Patil/3.png
if($line)
{
$lineLower=$line.tolower()
if($lineLower.Contains('proot')) # This condition works properly
{
Write-Host "PRoot"
}
if($lineLower.Contains('sroot')) # This condition fails.
{
Write-Host "SRoot"
}
if($lineLower.Contains('troot')) # This condition fails.
{
Write-Host "TRoot"
}
}
}
而不是使用多个 IF
- 你可以使用由
确定的 Root
前面的字母控制的开关
- a RegEX 将匹配的字符存储在捕获组 () 中,可通过
$Matches[1]
:
$filePath = '.\files.txt'
Get-Content $filePath | Where-Object {$_ -match '([PST])Root'} | ForEach-Object {
$line = $_
switch ($Matches[1]){
'P' {'{0}={1}' -f $_,$line} # code in {} to execute on P
'S' {'{0}={1}' -f $_,$line} # code in {} to execute on S
'T' {'{0}={1}' -f $_,$line} # code in {} to execute on T
}
}
示例输出:
P=P:/TEMP/PRoot/Digvijay/Patil/1.png
S=S:/TEMP/SRoot/Digvijay/Patil/2.png
T=T:/TEMP/TRoot/Digvijay/Patil/3.png
PS: -match
运算符和 switch 语句默认不区分大小写,
要更改该行为,请使用 -cmatch
resp。使用 -CaseSensitive
参数切换。
使用不区分大小写的 like 运算符 -ilike
foreach($line in Get-Content $filePath)
{
# Line can contain
# $line = P:/TEMP/PRoot/Digvijay/Patil/1.png
# $line = S:/TEMP/SRoot/Digvijay/Patil/2.png
# $line = T:/TEMP/TRoot/Digvijay/Patil/3.png
if($line)
{
if($line -ilike "*RRoot*")) # This condition works properly
{
# Process Rroot here
}
if($line -ilike "*SRoot*")) # This condition fails.
{
# Process SRoot here
}
if($line -ilike "*TRoot*")) # This condition fails.
{
# Process TRoot here
}
}
}
我正在尝试使用 powershell 脚本在字符串中查找子字符串。实际上,我正在逐行读取一个包含数千条路径的文件。我正在过滤来自文件的每个路径。路径过滤器正在查找路径中的子字符串。
但是当子字符串为 Sroot
或 TRoot
时,Contains
函数 returns 为 false。
以下是我的示例代码。
foreach($line in Get-Content $filePath)
{
# Line can contain
# $line = $/Patil/TEMP/PRoot/Digvijay/Patil/1.png
# $line = $/Patil/TEMP/SRoot/Digvijay/Patil/2.png
# $line = $/Patil/TEMP/TRoot/Digvijay/Patil/3.png
if($line)
{
if($line.Contains('RRoot')) # This condition works properly
{
# Process Rroot here
}
if($line.Contains('SRoot')) # This condition fails.
{
# Process SRoot here
}
if($line.Contains('TRoot')) # This condition fails.
{
# Process TRoot here
}
}
}
输入文件如下:
$/Patil/TEMP/PRoot/Digvijay/Patil/1.png
$/Patil/TEMP/SRoot/Digvijay/Patil/2.png
$/Patil/TEMP/TRoot/Digvijay/Patil/3.png
$/Patil/TEMP/WRoot/Digvijay/Patil/3.png
我试过你的代码,它按预期工作(将 $line.Contains('RRoot')
更改为 $line.Contains('PRoot'
)以匹配输入示例)。
我认为您可能正在努力解决区分大小写的问题。
我建议您尝试将 tolower()
函数应用于字符串,然后与小写字符串进行比较:
foreach($line in Get-Content $filePath)
{
# Line can contain
# $line = P:/TEMP/PRoot/Digvijay/Patil/1.png
# $line = S:/TEMP/SRoot/Digvijay/Patil/2.png
# $line = T:/TEMP/TRoot/Digvijay/Patil/3.png
if($line)
{
$lineLower=$line.tolower()
if($lineLower.Contains('proot')) # This condition works properly
{
Write-Host "PRoot"
}
if($lineLower.Contains('sroot')) # This condition fails.
{
Write-Host "SRoot"
}
if($lineLower.Contains('troot')) # This condition fails.
{
Write-Host "TRoot"
}
}
}
而不是使用多个 IF
- 你可以使用由 确定的
- a RegEX 将匹配的字符存储在捕获组 () 中,可通过
$Matches[1]
:
Root
前面的字母控制的开关
$filePath = '.\files.txt'
Get-Content $filePath | Where-Object {$_ -match '([PST])Root'} | ForEach-Object {
$line = $_
switch ($Matches[1]){
'P' {'{0}={1}' -f $_,$line} # code in {} to execute on P
'S' {'{0}={1}' -f $_,$line} # code in {} to execute on S
'T' {'{0}={1}' -f $_,$line} # code in {} to execute on T
}
}
示例输出:
P=P:/TEMP/PRoot/Digvijay/Patil/1.png
S=S:/TEMP/SRoot/Digvijay/Patil/2.png
T=T:/TEMP/TRoot/Digvijay/Patil/3.png
PS: -match
运算符和 switch 语句默认不区分大小写,
要更改该行为,请使用 -cmatch
resp。使用 -CaseSensitive
参数切换。
使用不区分大小写的 like 运算符 -ilike
foreach($line in Get-Content $filePath)
{
# Line can contain
# $line = P:/TEMP/PRoot/Digvijay/Patil/1.png
# $line = S:/TEMP/SRoot/Digvijay/Patil/2.png
# $line = T:/TEMP/TRoot/Digvijay/Patil/3.png
if($line)
{
if($line -ilike "*RRoot*")) # This condition works properly
{
# Process Rroot here
}
if($line -ilike "*SRoot*")) # This condition fails.
{
# Process SRoot here
}
if($line -ilike "*TRoot*")) # This condition fails.
{
# Process TRoot here
}
}
}