检查字符串是否像正则表达式一样

时间:2016-09-29 11:44:49

标签: regex powershell

我有一个包含许多应用程序的文件夹,用于在笔记本电脑或工作站上进行部署。现在这个文件夹变得一团糟,因为多个人使用这个文件夹,每个人都使用不同的存储方法。因此,我想编写一个脚本,帮助管理文件,我们总能找到它们。

在Powershell中我想。

  1. 列出所有文件(.msi,.exe,甚至更多)
  2. 确定文件是否已正确存储(Developer \ Application \ Application_version_architecture.extension,即Adobe \ Flashplayer \ Flashplayer_22_x64.msi)
  3. 如果是,请保留。
  4. 如果没有,我质疑脚本的用户     关于应用程序的一些事情,然后脚本重命名和     将其移动到正确的文件夹。
  5. 目前我仍然坚持第2步。我想使用正则表达式来确定标准应该是什么。但是,它会排除正确命名的应用程序。

    我使用以下命令检索文件名:

    Get-ChildItem -Path $path -Recurse -Name
    

    这将检索应用程序文件夹中的文件,其中包含完整路径 的为 “Adobe \安装Flashplayer \ Flashplayer_22_x64.msi” 或者当不正确时 的的 “Adobe \ flashplayeractivex.msi”

    然后我使用以下正则表达式检查它们是否正确

    \w*\\\w*\\[a-zA-Z]*\_[0-9a-zA-Z\.]*\_(([x][6][4])|([x][8][6])|([b|B][o][t][h]))\.(([m|M][s|S][i|I])|([e|E][x|X][e|E]))
    

    我已确认正在处理Rubular。 但是,我无法使用PowerShell。我尝试了以下内容:

    if ($file -match '\w*\\\w*\\[a-zA-Z]*\_[0-9a-zA-Z\.]*\_(([x][6][4])|([x][8][6])|([b|B][o][t][h]))\.(([m|M][s|S][i|I])|([e|E][x|X][e|E]))') {......commands...}
    

    由于逃脱似乎没有效果(Powershell对我犯了一些错误)。然后我尝试了:

    $pattern = [regex]::Escape('\w*\\\w*\\[a-zA-Z]*\_[0-9a-zA-Z\.]*\_(([x][6][4])|([x][8][6])|([b|B][o][t][h]))\.(([m|M][s|S][i|I])|([e|E][x|X][e|E]))')
    if ($file -match $pattern) {......commands...}
    

    哪个没有给我错误,但没有用,因为它没有“匹配”“Apple \ iTunes \ iTunes_12.3_x64.exe”,这与Rubular相匹配。

    有没有人认识到这个问题或看到我做错了什么?

1 个答案:

答案 0 :(得分:1)

我不会在一个正则表达式中尝试所有这些。相反,我会单独检查每个政策:

$path = 'C:\tmp'
$validExtensions = @('.msi', '.exe')
$filnameRegex = '\w+_[0-9a-zA-Z\.]+_(?:x32|x64|[b|B]oth)'

Get-ChildItem -Path $path -Recurse | ForEach-Object {
    if (-not ($_.Extension -cin $validExtensions))
    {
        Write-Host "$($_.FullName) has an invalid extension."
    }
    if (-not ($_.BaseName -match $filnameRegex))
    {
        Write-Host "$($_.FullName) doesn't match the filename policy."
    }

   if (3 -ne ($_.FullName.Split([System.IO.Path]::DirectorySeparatorChar).Length `
    - $path.Split([System.IO.Path]::DirectorySeparatorChar).Length))
    {
        Write-Host "$($_.FullName) doesn't match the directory policy."
    }
}