比较映射驱动器的两个文本文件,如果丢失则分配

时间:2014-10-29 16:52:49

标签: powershell

我有一个检查用户映射驱动器的脚本。我需要脚本做的是将用户当前映射的驱动器与具有驱动器号和路径的文本文件进行比较,如果缺少任何一个,则添加。如果我为该文本文件做了一个get-content,我会得到类似下面的内容。在驱动器号之后有N个空格。因此将它们分成两个变量需要一些正则表达式,我无法弄明白。

G  \\blahblah\blahb\blah      
H  \\blahblah\blah\blah
I  \\blahblah\blalah\blah           
L  \\blahblah\bla\blah       
W  \\blahblah\blaah\blah            
Y  \\blahblah\baah\blah  

目前我所拥有的所有代码都在下面。我尝试过很多东西,却无法到达任何地方。 提前谢谢大家。

$drives = @(Get-content "C:\temp\drives.txt")

Write-Host "Comparing network drives and adding missing ones"
$MappedDrives = Get-PSDrive | Where-Object{$_.DisplayRoot -match ('\\\w*')} |`
  Format-Table -Property Name,DisplayRoot -AutoSize -HideTableHeaders

Foreach($lines in $mappedDrives){
  IF($lines -ne $drives)
  {
    New-PSDrive –Name $_ –PSProvider FileSystem –Root "\\blah\blah\blah" –Persist
  }

2 个答案:

答案 0 :(得分:1)

所以,就像你说的那样,这可能是最简单的RegEx匹配(在我看来)。我构建了一个HashTable,然后引用它来验证/映射你的驱动器号。

类似于:

$Drives = @{}
Get-Content c:\temp\drives.txt | Where{$_ -match "^(.)\s+?(\\.+)"} | ForEach{$Drives.Add($matches[1],$matches[2].trim()}

好的,我们现在有一个所需驱动器列表。接下来与您已有的进行比较。你知道如何获得驱动器,但正如马特已经指出的那样,你做错了。好吧,有点儿。你得到了数据,但如果你要存储你需要存储对象的数据,而不是管道格式 - *(所以,没有格式表,格式列表,格式塔克斯等等。好的,有没有格式 - 炸玉米饼,但应该有,炸玉米饼很好吃)。但你掌握的基本命令是好的,我们将与之合作。

$MappedDrives = Get-PSDrive | Where-Object{$_.DisplayRoot -match ('\\\w*')}

所以现在我们可以将它作为一个对象引用,这很好。让我们检查是否有任何映射到字母的驱动器与我们想要的路径不匹配:

$Conflicts = $MappedDrives | Where{$Drives.keys -contains $_.Name} | ForEach{If($Drives.($_.Name) -notmatch $_.Root.trimend("\")){[PSCustomObject]@{'DriveLetter'=$_.Name;'DesignatedPath'=$Drives.($_.Name);'CurrentPath'=$_.Root}}
If($conflicts.count -gt 0){"At least one drive is incorrectly mapped, see below:";$Conflicts|FT}

之后我们映射其余部分:

$Drives.Keys | Where{$Conflicts.DriveLetter -notcontains $_} | ForEach{
    New-PSDrive –Name $_ –PSProvider FileSystem –Root $Drives.$_ –Persist
}

答案 1 :(得分:0)

首先,我们将您的文本数据转换为哈希表。

$desiredMappedDrives =  Get-Content C:\temp\drives.txt | ForEach-Object{
    $regex = [regex]"\s+"
    $regex.Replace($_,"=",1) -replace "\\","\\"
} | ConvertFrom-StringData

如果你看一下$desiredMappedDrives的价值:

Name                           Value                                                           
----                           -----                                                           
G                              \\blahblah\blahb\blah                                           
H                              \\blahblah\blah\blah                                            
I                              \\blahblah\blalah\blah                                          
L                              \\blahblah\bla\blah                                             
W                              \\blahblah\blaah\blah                                           
Y                              \\blahblah\baah\blah    

允许您执行的操作是将每个当前驱动器与列表的驱动器进行比较。再次,删除Format-Table cmdlet。

$MappedDrives = Get-PSDrive | Where-Object{$_.DisplayRoot -match ('\\\w*')}

这个答案的其余部分将与TheMadTechnicians相同。将它留在这里的唯一原因是它提供了一种不同的方法来制作哈希表并且我做了一些工作。 TheMad

中的提示帽