使用PowerShell解析网络共享列表

时间:2014-03-10 18:50:50

标签: regex powershell

我想解析一个“netuse”文件并在一行/文件中写入网络连接,在它们之间填充“#”

像这样:

  
    

R:\\ SERVER \为share1#S:\\ SERVER \ SHARE2#Y:\\ SERVER \ SHARE3 \文件夹

  

我的netuse文件如下:

New connections will be remembered.

Status       Local     Remote                    Network

-------------------------------------------------------------------------------
OK           R:        \\SERVER\SHARE1     Microsoft Windows Network
OK           S:        \\SERVER\SHARE2             Microsoft Windows Network
OK           Y:        \\SERVER\SHARE3\FOLDER  Microsoft Windows Network

The command completed successfully.

我的测试代码:

$NetUseFile= Get-Content "C:\temp\netuse.txt"
$NetworShareStr = $NetUseFile | Select-String -Pattern "^.*\s+([a-zA-Z]):\s+(\\\\[a-zA-Z0-9_-]+\\.+)\s+Microsoft Windows Network$";

TrimStart(“OK”)?

我尝试了几种没有运气的方法。任何人都可以帮忙解决这个问题吗?

编辑:

@TheMadTechnician我知道..但是我需要解析那个文件...... 我又添加了两个字段

HOSTNAME:DESKTOP1
USERNAME:USER1

我想要这个输出:

USER1,DESKTOP1,R:\\SERVER\SHARE1#M:\\SERVER\SHARE2#X:\\SERVER\SHARE3\FOLDER

$NetUseFile= Get-Content "C:\temp\netuse.txt"

$HostnameStr = $NetUseFile | Select-String -Pattern "HOSTNAME:"
$UsernameStr = $NetUseFile | Select-String -Pattern "USERNAME:"
$test = New-Object -TypeName PSObject
$test | Add-Member –MemberType NoteProperty –Name 'Hostname' –Value
        $HostnameStr.ToString().Split(":")[1]
$test | Add-Member –MemberType NoteProperty –Name 'Username' –Value  
        $UsernameStr.ToString().Split(":")[1]

如何在对象中添加此成员? (对我来说太内联了)。

gc C:\temp\meilehj.txt |?{$_ -match "^.*\s+([a-zA-Z]:)\s+(.+?)\s"} 
| foreach { 
Add-Member -InputObject $test –MemberType NoteProperty -Name 'Share' -Value   
$Matches[1]
Add-Member -InputObject $test –MemberType NoteProperty -Name 'Path' -Value   
$Matches[2]
??
}

如何使用'#'加入Share和Path?

编辑:

@TheMadTechnician 非常感谢!!

2 个答案:

答案 0 :(得分:3)

您无需输入文件; PowerShell可以为您提供所有信息。

$drives = get-psdrive -psprovider FileSystem|Where-Object {$_.DisplayRoot -like '\\*'};
$AllMappings = "";
foreach ($Drive in $Drives) {
    $AllMappings += "$($Drive.Name):$($Drive.DisplayRoot)#";
}
# Since there's a trailing hashmark, grab the full string minus the last character
$AllMappings.Substring(0,$AllMappings.Length-1);

答案 1 :(得分:2)

你抓的比你想要的多。试试这个:

$NetUseFile= Get-Content "C:\temp\netuse.txt"
$HostnameStr = ($NetUseFile | Select-String -Pattern "HOSTNAME:")|%{$_.tostring().Substring(9,$_.tostring().Length-9)}
$UsernameStr = ($NetUseFile | Select-String -Pattern "USERNAME:")|%{$_.tostring().Substring(9,$_.tostring().Length-9)}
$NetworkShareStr = (gc C:\temp\meilehj.txt|?{$_ -match "OK\s+([a-zA-Z]:)\s+(.+?)\s+?Microsoft Windows Network.*$"}|%{
    $Matches[1].ToString()+$Matches[2].ToString()
    }) -join("#")
Write-Output "$UsernameStr,$HostnameStr,$NetworkShareStr"|Out-File C:\Temp\Output.txt

编辑:alroc的答案是一条更好的路线,我真的只是帮助您最初要求的RegEx。 Edit2:更新了脚本以更好地回答更新的问题。它现在起作用: 将输入文件读入变量 查找包含HOSTNAME:string的行,选择一个排除前9个字符的子字符串(“HOSTNAME :),将其分配给变量
在USERNAME中查找行:字符串,选择排除前9个字符的子字符串(“USERNAME :),将其分配给变量
查找与网络共享模式匹配的所有行,仅选择驱动器号和路径,并使用哈希标签将所有结果连接在一个字符串中。将其分配给变量 将所有变量(逗号分隔)输出为文件C:\ Temp \ Output.txt中的单行 Edit3:更新了RegEx,以便它可以容纳名称中带有空格的共享。 RegEx解释说:

确定\ s +([a-zA-Z]:)\ s +(。+?)\ s +?Microsoft Windows网络。* $

确定匹配字符OK(区分大小写)

\ s +匹配任何空格字符[\ r \ n \ t \ f]
量词:在一次和无限次之间,尽可能多次,根据需要回馈[贪心]

第一捕获组([a-zA-Z]:)

[a-zA-Z]匹配下面列表中的单个字符

a-z a和z之间范围内的单个字符(区分大小写)
A-Z A和Z之间范围内的单个字符(区分大小写)

:匹配字符:字面意思

\ s +匹配任何空格字符[\ r \ n \ t \ f]
量词:在一次和无限次之间,尽可能多次,根据需要回馈[贪心]

第二捕获组(。+?)

。+?匹配任何字符(换行除外)
量词:在一次和无限次之间,尽可能少的时间,根据需要扩展[懒惰]

\ S +?匹配任何空格字符[\ r \ n \ t \ f]
量词:在一次和无限次之间,尽可能少的时间,根据需要扩展[懒惰]

Microsoft Windows网络字面匹配Microsoft Windows网络字符(区分大小写)

。*匹配任何字符(换行除外)
量词:在零和无限次之间,尽可能多次,根据需要回馈[贪心]

$断言一行的位置 在此 link 进行测试(使用漂亮的颜色编码和所有颜色)!