Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Out-File -избежать создания пустого файла (http://forum.oszone.net/showthread.php?t=344310)

solonenko 04-03-2020 15:20 2911975

Out-File -избежать создания пустого файла
 
Добрый день.
Имеется текстовый файл, каждая строка начинается с "1;№телефона;*". Задача проверить на соответствие маске "79*********" и записать в лог-файл, если есть некорректные телефоны
Код:

$bird=$null
$stringnew=$null
$stringnew = (Get-Content "C:\fb\EXT.txt").Trim() #читаем файл - отрезаем возможные пробелы
foreach ($bird in $stringnew) { #проверяем в цикле каждую строку на корректность номера
if ($bird -notmatch '^?;79\d{9};') #шаблон
    {
    "Ошибка шаблона;"+$bird | Out-File -FilePath c:\fb\EXT_ERROR_PHONE.txt -Append #если не соответствует маске - в эррор-файл
    }
else
{
$bird | Out-File -FilePath C:\fb\EXT_OUT.txt -Append #если соответствует маске - в работу
}
}

Если строка содержит некорректный №тел - создается файл -все ок.
Если строка НЕ содержит некорректный №тел - создается пустой файл EXT_ERROR_PHONE.txt
Как этого избежать

p\s
Код:

(Get-Content "C:\fb\EXT_.txt").Trim() | Where-Object {$_ -notmatch '^?;79\d{9};'} | Out-File c:\fb\EXT_ERROR_PHONE.txt
Та же история, пустой файл есть (а он мне не нужен). Подозреваю - причина одна...

*Set-Content также себя ведет

DJ Mogarych 04-03-2020 15:39 2911976

Пример файла дайте

solonenko 04-03-2020 15:50 2911980

Вложений: 1
Цитата:

Цитата DJ Mogarych
Пример файла дайте »

Файл 160607

DJ Mogarych 04-03-2020 16:54 2911987

Наверное, так:
Код:

$right,$wrong = (gc D:\temp\ext.txt).trim().where({$_ -match "^?;79\d{9};"}, 'Split')
$right |Out-File C:\fb\EXT_OUT.txt -Append
if ($wrong) {$wrong |% {"Ошибка шаблона;"+$_} |Out-File C:\fb\EXT_ERROR_PHONE.txt -Append}


YuS_2 04-03-2020 17:42 2912003

Цитата:

Цитата solonenko
'^?;79\d{9};' »

Любопытный шаблон...
Совпадает, если начало строки ноль или один, за которым следует точка с запятой, за ней сразу же следует символ семь, затем девять, за ней девять любых цифр и точка с запятой - он точно у Вас работает? Ибо на тексте, который был показан, совпадения никогда не будет найдено и все строки будут в логе ошибок.
Цитата:

Цитата solonenko
Как этого избежать »

Код:

if ($a = (sls ext.txt -patt '^[^;]*;\s*79\d{9}' -not -enc default)){$a.line.trim()|out-file error.txt -enc default}

solonenko 04-03-2020 18:12 2912015

Цитата:

Цитата YuS_2
Любопытный шаблон... »

Да, для моей задачи этого достаточно.
За комментарий спасибо, изучу.

DJ Mogarych,
Спасибо

YuS_2 04-03-2020 18:28 2912023

Цитата:

Цитата solonenko
Да, для моей задачи этого достаточно. »

А, ну да, работать-то он будет... но составлен неверно, в этой части:
Код:

^?
- так шаблоны не составляют, в этом нет смысла. Либо учитывать начало строки (тогда пишут "^"), либо не учитывать (тогда символ "^" не пишут). А квантификатор "?" обычно используют с реальными символами или классами символов...


Время: 11:22.

Время: 11:22.
© OSzone.net 2001-