Как эта командная команда будет выглядеть в PowerShell? - PullRequest
0 голосов
/ 14 сентября 2018

Это хорошо работает в командной строке. Попытка запустить его в PowerShell без удачи, синтаксис, очевидно, отличается.

for %%f in (*.hej) do (
    findstr /V "Channel Record TESTBOOL OK OPC Item _COMMCHECK_ SYSTEM ADMINISTRATOR Unknown ItemID Field's Connection hutdown acknowledged Alarming Suspended primary SAC reloaded Fix32" %%f > %%f.txt
    del %%f
    ren %%f.txt %%f
)

Я перебираю все файлы с hej-окончанием и удаляю любую строку, содержащую любое из слов после findstr /V.

Edit: Код работает отдельно от кодировки и выглядит следующим образом:

$encoding = [System.Text.Encoding]::GetEncoding(1252)
$filter  = 'M:\ALM\*.alm'
$pattern = "Channel|Record|TESTBOOL|OK|OPC|Item|_COMMCHECK_|SYSTEM|ADMINISTRATOR|Unknown|ItemID|Field's|Connection|hutdown|acknowledged|Alarming|Suspended|primary|SAC|reloaded|Fix32"

(Select-String -encoding $encoding -Path $filter -Pattern $pattern -NotMatch) |
    ForEach-Object -Begin {Remove-Item $filter} -Process {$_.line | Out-File -Append -encoding $encoding $_.filename }

Были проблемы с кодировкой, но он переключился с Powershell 5 на Powershell Core, там он работал так: $encoding = [System.Text.Encoding]::GetEncoding(1252).

Последнее добавление - у меня нет прав на запись в сетевую папку, поэтому я бы хотел, чтобы «очищенные» файлы сохранялись в локальной папке. Пытались лишить $_.filename своего пути без успеха, используя

| Out-File -Append -encoding $encoding c:\temp\(Get-Item '$_.filename').Basename }

Приветствия

Исходный образец данных:

2018-05-19  00:22:07,166 [LUNSC1  ] Fix32.LUNSC1.LUNOP9_COMMCHECK_DV2.F_CV set to 0 by LUNOP9::SYSTEM ADMINISTRATOR                 
2018-05-19  00:23:35,226 [LUNSC2  ] Fix32.LUNSC2.LUNOP10_COMMCHECK_DV2.F_CV set to 0 by LUNOP10::SYSTEM ADMINISTRATOR               
2018-05-19  00:24:07,169 [LUNSC1  ] Fix32.LUNSC1.LUNOP9_COMMCHECK_DV2.F_CV set to 0 by LUNOP9::SYSTEM ADMINISTRATOR                 
2018-05-19  00:25:02,046 [LUNSC1  ] Fix32.LUNSC1.LUNOP9_COMMCHECK_DV.F_CV set to 0 by LUNSC1                                        
2018-05-19  00:25:07,975 [LUNSC1  ] Fix32.LUNSC1.LUNOP9_COMMCHECK_DV2.F_CV set to 1 by LUNOP9::SYSTEM ADMINISTRATOR                 
2018-05-19  00:25:35,232 [LUNSC2  ] Fix32.LUNSC2.LUNOP10_COMMCHECK_DV2.F_CV set to 0 by LUNOP10::SYSTEM ADMINISTRATOR               
2018-05-19  00:26:00,551 [LUNSC1  ] D_TA204_GT1_DV_AL             CFN              LARM      D_TA204_GT1_Reglerfel                  
2018-05-19  00:27:07,165 [LUNSC1  ] Fix32.LUNSC1.LUNOP9_COMMCHECK_DV2.F_CV set to 1 by LUNOP9::SYSTEM ADMINISTRATOR                 
2018-05-19  00:27:35,235 [LUNSC2  ] Fix32.LUNSC2.LUNOP10_COMMCHECK_DV2.F_CV set to 0 by LUNOP10::SYSTEM ADMINISTRATOR               
2018-05-19  00:28:01,049 [LUNSC1  ] D_TA204_GT41_DV_AL            CFN              LARM      D_TA204_GT41_Reglerfel                 
2018-05-19  00:28:01,049 [LUNSC1  ] D_TA204_GT31_DV_AL            CFN              LARM      D_TA204_GT31_Reglerfel                 
2018-05-19  00:28:01,049 [LUNSC1  ] D_TA204_GT21_DV_AL            CFN              LARM      D_TA204_GT21_Reglerfel   

1 Ответ

0 голосов
/ 14 сентября 2018

В PowerShell что-то подобное будет делать то, что вы описали:

$filter  = '*.hej'
$pattern = "Channel|Record|TESTBOOL|OK|OPC|Item|_COMMCHECK_|SYSTEM|ADMINISTRATOR|Unknown|ItemID|Field's|Connection|hutdown|acknowledged|Alarming|Suspended|primary|SAC|reloaded|Fix32"

(Select-String -Path $filter -Pattern $pattern -NotMatch) |
    ForEach-Object -Begin {Remove-Item $filter} -Process {$_.line >> $_.filename}
...