Эффективный способ извлечь эту строку текста - PullRequest
0 голосов
/ 16 марта 2020

Я начал свой путь с изучения оболочки Power Power и щедрой обратной связи с другими, я наконец почти закончил свой первый полезный сценарий и настроил его по своему вкусу. Мне просто нужно немного помочь, чтобы преодолеть это последнее препятствие, я Я пробовал несколько методов и просто не могу получить желаемый результат

Цель

Чтобы взять текстовый файл, который включает в себя следующий беспорядок

Set WN = CreateObject("WScript.Network")
Set Ws = CreateObject("WScript.shell")
US=WN.USERNAME
D="q,\\abc-filesvr-03\shared$,g,\\abc-ngfs-01\pingate$,s,\\abc-ngfs-01\mdis-com$,i,\\abc-civica-01\icondata$"
A=SPLIT(D,",")
DO UNTIL B>UBOUND(A) 
MAPDRIVE A(B),A(B+1)
B=B+2
LOOP


Sub MapDrive(DriveLetter, UNCPath)
    on error resume next
    WN.RemoveNetworkDrive DriveLetter&":",1,1
    on error resume next
    WN.MapNetworkDrive DriveLetter&":",UNCPath
    if err<>0 then 
    'ws.EXEC "msg.exe %username% Message from LOGON script - Error connecting drive " & DriveLetter & " to " & UNCPath & " - user is    " & US& " - Further message is - " & err.description
    'ER " Message from LOGON script - Error connecting drive " & DriveLetter & " to " & UNCPath & " - user is " & US& " - Further message is - " & err.description
    end if
End Sub


sub er(m)
    m = m & wn.computername
    PF = "\\abc-ngfs-01\logons$\ERRORS"
    PT = PF & "\" & US
    SET OBJFSO = CREATEOBJECT("scripting.filesystemobject")
    if OBJFSO.FOLDEREXISTS(PF) THEN
        F = 1
        DO UNTIL NOT OBJFSO.FILEEXISTS(PT & F)
            F = F + 1
        LOOP
        OBJFSO.CREATETEXTFILE(PT & F)
        set fl = OBJFSO.opentextfile(PT & F,8)
        fl.write(DATE & "[]" & TIME & "[]" & us & "[]" & m & "[][][]")
        fl.close
        set fl = nothing
    END IF
end sub

Извлеките части, которые включают в себя диски (ниже), и сохраните их в переменной для последующего использования

D="q,\\abc-filesvr-03\shared$,g,\\abc-ngfs-01\pingate$,s,\\abc-ngfs-01\mdis-com$,i,\\abc-civica-01\icondata$"

В зависимости от используемого текстового файла имена дисков будут меняться, поэтому я не могу предварительно указав это

Я экспериментировал с попыткой использования файловых фильтров, в которых есть список слов или символов, которые нужно исключить - похоже, ничего не получилось с этим

Например

    $inputfile = "C:\users\admin\desktop\inputfile.txt"
    $outputfile = "C:\users\admin\desktop\outputfile.txt"
    $filterFile = "C:\users\admin\desktop\filterFile.txt"
    $filters = Get-Content $filterFile
    Get-Content $inputFile | Select-String -pattern $filters -notMatch | Out-File $outputFile

Просто интересно, может ли кто-нибудь придумать эффективный метод для использования, так как мне кажется, что я слишком усложняю это?

1 Ответ

1 голос
/ 16 марта 2020

Для одного входного файла вы можете использовать:

$inputfile = "C:\users\admin\desktop\inputfile.txt"
$drives = (Select-String -Path $inputfile -Pattern '(D=.+)').Line

Результат

$drives --> D="q,\\abc-filesvr-03\shared$,g,\\abc-ngfs-01\pingate$,s,\\abc-ngfs-01\mdis-com$,i,\\abc-civica-01\icondata$"

Если вы хотите, чтобы это разделялось на объекты со свойствами Driveletter и Path:

$items = $drives -replace '^D=|"' -split ',' 
for ($i = 0; $i -le $items.Count - 1; $i +=2) {
    [PsCustomObject]@{DriveLetter = $items[$i]; Path = $items[$i + 1]}
}

Результат

DriveLetter Path                     
----------- ----                     
q           \\abc-filesvr-03\shared$ 
g           \\abc-ngfs-01\pingate$   
s           \\abc-ngfs-01\mdis-com$  
i           \\abc-civica-01\icondata$

При использовании этого для ряда файлов в папке:

$inputPath = 'C:\users\admin\desktop'
Get-ChildItem -Path $inputPath -Filter '*.txt' -File | ForEach-Object {
    $drives = ($_ | Select-String -Pattern '(D=.+)').Line
    if ($drives) {
        $items = $drives.Trim() -replace '^D=|"' -split ',' 
        for ($i = 0; $i -le $items.Count - 1; $i +=2) {
            # add the file where this was found in the output
            [PsCustomObject]@{DriveLetter = $items[$i]; Path = $items[$i + 1]; SourceFile = $_.FullName}
        } 
    }
}

Результат:

DriveLetter Path                      SourceFile                   
----------- ----                      ----------                
q           \\abc-filesvr-03\shared$  C:\users\admin\desktop\inputfile.txt  
g           \\abc-ngfs-01\pingate$    C:\users\admin\desktop\inputfile.txt  
s           \\abc-ngfs-01\mdis-com$   C:\users\admin\desktop\inputfile.txt  
i           \\abc-civica-01\icondata$ C:\users\admin\desktop\inputfile.txt 
q           \\abc-filesvr-03\shared$  C:\users\admin\desktop\anotherfile.txt
g           \\abc-ngfs-01\pingate$    C:\users\admin\desktop\anotherfile.txt
s           \\abc-ngfs-01\mdis-com$   C:\users\admin\desktop\anotherfile.txt  
i           \\abc-civica-01\icondata$ C:\users\admin\desktop\anotherfile.txt

Если вы хотите сохранить это в новый выходной CSV-файл, просто добавьте

| Export-Csv -Path 'C:\users\admin\desktop\outputfile.csv' -NoTypeInformation -UseCulture

после заключительной фигурной скобки }

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...