2016-09-29 107 views
2

我有一个用于在笔记本电脑或工作站上部署的许多应用程序的文件夹。现在这个文件夹变得很混乱,因为多人使用这个文件夹,每个人都使用不同的存储方法。因此我想编写一个脚本来帮助管理这些文件,我们总能找到它们。检查字符串是否像正则表达式

在Powershell我想。

  1. 目录中的所有文件(的.msi,.exe和可能更多)
  2. 确定如果文件被正确已经存储(开发\应用\ Application_version_architecture.extension即需要Adobe \安装Flashplayer \ Flashplayer_22_x64.msi)
  3. 如果属实,请保留它。
  4. 如果没有,我怀疑脚本 一些事情有关应用程序中的脚本,然后重命名并 它移动到正确的文件夹的用户。

目前我卡在第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...} 

哪个没给我的错误,但没有工作,因为它没有“匹配”“苹果\ iTunes的\ iTunes_12.3_x64.exe”这确实对Rubular匹配。

有谁认识这个问题,或者看看有什么我做错了什么?

回答

0

我不会尝试这一切都在一个单一的正则表达式。相反,我会逐个检查每个策略:

$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." 
    } 
} 
相关问题