我有一个包含许多应用程序的文件夹,用于在笔记本电脑或工作站上进行部署。现在这个文件夹变得一团糟,因为多个人使用这个文件夹,每个人都使用不同的存储方法。因此,我想编写一个脚本,帮助管理文件,我们总能找到它们。
在Powershell中我想。
目前我仍然坚持第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相匹配。
有没有人认识到这个问题或看到我做错了什么?
答案 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."
}
}