使用正则表达式从txt文件中获取UNC路径

时间:2019-03-05 19:34:16

标签: powershell

我正在尝试从不是unc路径的txt文件中删除所有数据,因此实际上是UNC路径之前的所有内容。

我将txt文件存储为变量,并且想要查找/替换。

我希望此正则表达式字符串与文件的开头匹配,并替换第一组双引号和之间的所有内容,但这不起作用。

$lstdata -replace "^"""(\\.""),""



"\app\Program\" "\\Server1\H\RUN\client\client-CD\201901-CD\C116B726\Program\*.*"
"\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\Autorun\*.*"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXCOURFB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXCOURFI.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXCOURFR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVFB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVFR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVPB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVPI.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVPR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app.CFG"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app.chm"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\dxr.cnt"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app.TIP"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app001.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app002.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\dxr32.exe"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app3201.EXE"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXTIMSPB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXTIMSPI.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXTIMSPR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DX_View_EULA_v1.0.htm"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\FONTINFO.OFS"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\stamp.exe"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\tr01_d50.icm"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\watermark.enc"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\xerces-c_2_8.dll"
"\app\MNU\" "\\Server1\H\RUN\client\client-CD\201901-CD\C116B726\Mnu\*.*"
"\app\Data\20190101\PNCC116B726SAV\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190101\PNCC116B726SAV\*.*"
"\app\Data\20190104\MWCC116B726DDA\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190104\MWCC116B726DDA\*.*"
"\app\Data\20190125\MWCC116B726DDA\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190125\MWCC116B726DDA\*.*"
"\app\Data\20190131\MWCC116B726DDA\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190131\MWCC116B726DDA\*.*"

2 个答案:

答案 0 :(得分:5)

构造描述以下内容的正则表达式模式:

\\[HostName]\[ShareName]\[FilePath]

,然后替换它周围的所有内容。这应该在这里完成:

$lstdata -replace '.*(\\{2}[^\\"]+\\[^\\"]+\\[^"]+).*','$1'
#                  \/      \_____/  \_____/  \___/ \/
#              Stuff          |        |       |    Stuff
#                         HostName     |       |
#                                  ShareName   |
#                                           FilePath

答案 1 :(得分:1)

使用基于Mathias R. Jessen's helpful answer运算符的替代项对-split进行补充

查看您的输入数据,每行上的UNC路径位于第二个(最后一个)双引号("...")标记中,因此您可以按"个字符对每行进行拆分。并返回倒数第二个令牌,即索引为-2的令牌(PSv4 +语法,由于使用了 .ForEach()数组方法 ):

# $lstdata is assumed to be an array with the file's lines.
# You can also call .ForEach on (Get-Content ...) directly.
$lstdata.ForEach({ $_ -split '"')[-2] })

如果可以在结果中包含双引号,则可以简单地将其分隔为空白,这就是-split一元形式:

$lstdata.ForEach({ (-split $_)[-1] })

PSv3-中,.ForEach()数组方法不可用,您必须使用-速度明显慢- { 管道中的{1}} cmdlet (其内置别名为ForEach-Object):

%

也就是说,使用管道的好处是内存限制 的潜力:如果您要在同一管道中使用# Without double quotes $lstdata | ForEach-Object { ($_ -split '"')[-2] } # With double quotes. $lstdata | ForEach-Object { (-split $_)[-1] } 提供输入并将结果输出到与Get-Content相同的管道中的文件中,由于会发生读写操作,因此不需要将输入文件作为一个整体加载到内存中。一次一行。