2016-09-29 103 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." 
    } 
} 
相關問題