我想解析一个“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 非常感谢!!
答案 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 进行测试(使用漂亮的颜色编码和所有颜色)!