Regex 使用PowerShell分析网络共享列表

Regex 使用PowerShell分析网络共享列表,regex,powershell,Regex,Powershell,我想解析一个“netuse”文件,并在一行/文件中写入网络连接,在它们之间填充一个“#” 像这样: R:\\SERVER\SHARE1\S:\\SERVER\SHARE2\Y:\\SERVER\SHARE3\FOLDER 我的netuse文件如下所示: New connections will be remembered. Status Local Remote Network ----------------------------

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

像这样:

R:\\SERVER\SHARE1\S:\\SERVER\SHARE2\Y:\\SERVER\SHARE3\FOLDER

我的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”)

我尝试了几种方法,但都没有成功。有人能帮我吗

编辑:

@我认识的那位技术员。。但我需要解析那个文件。。。 我又添加了两个字段

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]
如何在对象中添加此成员?(对我来说太内联了:)

用“#”连接Share和Path如何

编辑:

@技术员
非常感谢

不需要输入文件;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);

你捕获的比你想要的更多。试试这个:

$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的答案是一个更好的选择,我的答案真的只是像您最初要求的那样帮助处理正则表达式。 Edit2:更新脚本以更好地回答更新后的问题。它现在的功能如下: 将输入文件读取到变量。
查找其中包含HOSTNAME:string的行,选择不包含前9个字符的子字符串(“HOSTNAME:”),将其分配给变量
查找其中包含USERNAME:string的行,选择不包含前9个字符的子字符串(“USERNAME:”),将其分配给变量
查找与网络共享模式匹配的所有行,仅选择驱动器号和路径,并使用哈希标记将所有结果合并在一个字符串中。将其分配给变量。
将所有变量(逗号分隔)作为一行输出到文件C:\Temp\Output.txt中
Edit3:更新了RegEx,以便在名称中容纳带有空格的共享。RegEx解释说:

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

OK按字面意思匹配字符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]
量词:在一次和无限次之间,尽可能多地,根据需要回馈[贪婪]

第二捕获组(+?)

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

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

Microsoft Windows网络与Microsoft Windows网络中的字符完全匹配(区分大小写)

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

$assert行末尾的位置
在这里测试它(使用漂亮的颜色编码和所有功能)

您可以将第一行后面的所有内容替换为
$AllMappings=($drives | foreach{“$”($.Name):$($.DisplayRoot)”)-加入“#”
,这在我看来仍然可读性很好。我玩过您的regexp,运气不好。你能帮我在共享文件夹里留个空白吗。像“M:\\SERVER\SHARE FOLDER”
M:\\SERVER\SHARE FOLDER Microsoft Windows Network
非常感谢!
$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