powershell -match Unexpect Results

时间:2017-04-05 11:13:37

标签: powershell

我编写了一个简单的PowerShell脚本,旨在获取文件名,然后将文件移动到特定文件夹中。

有问题的文件是以PDF文档形式扫描的表格。

在文件名中,我定义了一个唯一的字符串,用于帮助识别它是哪个表单,然后我的脚本将文件排序到正确的文件夹中。

我已将文件名捕获为字符串变量。

我使用-match来评估文件名字符串变量,我的问题是匹配就像......好像。

例如,我的脚本在字符串中查找(F1),如果返回true,我的脚本会将文件移动到名为IT帐户请求的文件夹中。

这一切都很有效,直到我的脚本在名称中找到一个带有(F10)的文件,因为'match'将评估字符串并找到F1的匹配项。

如何使用'match'为精确的字符串块返回true?

我知道这可能听起来像一个相当基本的新手问题,但我如何使用-match来区分两种文件类型?

我已经在网上搜索,想要学习如何强制匹配我想做的事情,但也许我需要在这里重新思考并使用“匹配”之外的东西来获得我需要的结果?

感谢您阅读本文的时间。

代码示例:

$Master_File_name = "Hardware Request (F10).pdf"

if ($Master_File_name -match "(F1)"){Write-Output "yes"}
if ($Master_File_name -match "(F10)"){Write-Output "yes"}

两个if语句都返回'yes'

1 个答案:

答案 0 :(得分:3)

-match基于正则表达式匹配您的字符串,这意味着右侧参数是正则表达式模式,而不是文字字符串。

在正则表达式中,(F1)表示“匹配F和1,并将子字符串捕获为单独的组”。

要匹配文字字符串(F1),请手动转义模式:

if($Master_File_Name -match '\(F1\)'){Write-Output 'yes'}

或者使用Regex.Escape()方法自动完成:

if($Master_File_Name -match [regex]::Escape('(F1)')){Write-Output 'yes'}