Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 21.06.2017
Сообщений: 58

Проблема с выводом информации в файл

09.01.2020, 18:07. Показов 1868. Ответов 4

Студворк — интернет-сервис помощи студентам
Есть такой скрипт
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function Get-NetworkStatistics
{
    $properties = ‘Protocol’,’LocalAddress’,’LocalPort’
    $properties += ‘RemoteAddress’,’RemotePort’,’State’,’ProcessName’,’PID’
 
    netstat -ano | Select-String -Pattern ‘\s+(TCP|UDP)| ForEach-Object {
 
        $item = $_.line.split(” “,[System.StringSplitOptions]::RemoveEmptyEntries)
 
        if($item[1] -notmatch ‘^\[::’)
        {           
            if (($la = $item[1] -as [ipaddress]).AddressFamily -eq ‘InterNetworkV6’)
            {
               $localAddress = $la.IPAddressToString
               $localPort = $item[1].split(‘\]:’)[-1]
            }
            else
            {
                $localAddress = $item[1].split(‘:’)[0]
                $localPort = $item[1].split(‘:’)[-1]
            } 
 
            if (($ra = $item[2] -as [ipaddress]).AddressFamily -eq ‘InterNetworkV6’)
            {
               $remoteAddress = $ra.IPAddressToString
               $remotePort = $item[2].split(‘\]:’)[-1]
            }
            else
            {
               $remoteAddress = $item[2].split(‘:’)[0]
               $remotePort = $item[2].split(‘:’)[-1]
            } 
 
            New-Object PSObject -Property @{
                PID = $item[-1]
                ProcessName = (Get-Process -Id $item[-1] -ErrorAction SilentlyContinue).Name
                Protocol = $item[0]
                LocalAddress = $localAddress
                LocalPort = $localPort
                RemoteAddress =$remoteAddress
                RemotePort = $remotePort
                State = if($item[0] -eq ‘tcp’) {$item[3]} else {$null}
            } | Select-Object -Property $properties
        }
    }
}
 
$pth= $PSScriptRoot + '\return.txt' 
Get-NetworkStatistics |Format-Table |Out-File -FilePath $pth
Сама функция в консоли отрабатывает как надо. Однако неясно, почему не происходит создания и записи текстового файла.
В чем может быть ошибка?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2020, 18:07
Ответы с готовыми решениями:

Проблема с выводом информации в консольное окно.
у меня встала проблема с выводом информации в консольное окно. Как создавать и как работать с кончольными приложениями все понятно, но я,...

Батник с выводом информации в файл
Добрый день! Подскажите, пожалуйста, в чем ошибка? Батник собирает информацию о наличии какой-нибудь программы в program files (на...

Командный файл с выводом информации о пользователях
Нужно на с под Дебиан реализовать файл, который выдавал бы при выполнении информацию про то, какой пользователь его запустил, имя...

4
Эксперт NIX
3305 / 933 / 201
Регистрация: 14.01.2013
Сообщений: 4,769
09.01.2020, 18:47
Цитата Сообщение от Котейский Посмотреть сообщение
Сама функция в консоли отрабатывает как надо. Однако неясно, почему не происходит создания и записи текстового файла.
Надо разобрать по шагам. Если одна команда:
Цитата Сообщение от Котейский Посмотреть сообщение
Get-NetworkStatistics
Выводит что-то на экран, значит надо добавить | Format-Table (кстати, может там пробела не хватает?) Если после этого вывода нет, то разбираться с форматом. Если есть, смотрим чему равен $pth. И т.д.

Добавлено через 5 минут
Можно сразу посмотреть, чему равна $PSScriptRoot
0
0 / 0 / 0
Регистрация: 21.06.2017
Сообщений: 58
09.01.2020, 20:09  [ТС]
Цитата Сообщение от Kubuntovod Посмотреть сообщение
ыводит что-то на экран, значит надо добавить | Format-Table (кстати, может там пробела не хватает?) Если после этого вывода нет, то разбираться с форматом. Если есть, смотрим чему равен $pth. И т.д.
Я проверил. В том и дело, что вроде все просто, а не ясно где ошибка. И прробелы ни при чем ни Format-Table. В переменной $PSScriptRoot хранится путь до директории из которой выполняется скрипт (он у меня отдельным файлом).
Вот я проверяю, работает ли переменная $PSScriptRoot:

PowerShell
1
2
$path = $PSScriptRoot + '\blablabla.txt'
$path |Out-File -FilePath $path
И да, все работает. В директории создается текстовый документ blablabla.txt и в котором записан полный путь этого текстового документа.
Если запустить код (тот который в самом первом сообщении) из ISE и путь файла прописать вручную, то все работает. Но если запустить этот код как отдельный фал-скрипт с использованием $PSScriptRoot то код не сработает, притом работоспособность $PSScriptRoot была проверена.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
10.01.2020, 09:07
ИМХО если юзать регулярные выражения то по полной
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Get-NetworkStatistics{
    $netStartOut = .{netstat -ano}
    $pattern = '(TCP|UDP)\s+([\d\.]+):(\d+)\s+([\d\.]+):(\d+)\s+(\w+)\s+(\d+)'
    $stack = New-Object System.Collections.Stack
 
    [regex]::Matches($netStartOut, $pattern) | % {
    $stack.Push(
                (New-Object PSObject -Property @{
                    PID = $_.Groups[7].Value
                    ProcessName = (Get-Process -Id $_.Groups[7].Value -ErrorAction SilentlyContinue).Name
                    Protocol = $_.Groups[1].Value
                    LocalAddress = $_.Groups[2].Value
                    LocalPort = $_.Groups[3].Value
                    RemoteAddress =$_.Groups[4].Value
                    RemotePort = $_.Groups[5].Value
                    State = $_.Groups[6].Value
                }))
    }
    $stack
}
 
Get-NetworkStatistics | ft | Out-File c:\tmp\out.txt -Encoding default
ах да IPv6 не учел
1
2 / 1 / 2
Регистрация: 22.11.2018
Сообщений: 23
10.01.2020, 09:25
Лучший ответ Сообщение было отмечено Котейский как решение

Решение

Вот так работает. С повершеллом сильно не работал, поэтому не знаю, почему он меня заставил все кавычки заменить. И да, переменная $PSScriptRoot в итоге оказывается пустая.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function Get-NetworkStatistics
{
    $properties = "Protocol","LocalAddress","LocalPort"
    $properties += "RemoteAddress","RemotePort","State","ProcessName","PID"
 
    netstat -ano | Select-String -Pattern "\s+(TCP|UDP)" | ForEach-Object {
 
        $item = $_.line.split(" ",[System.StringSplitOptions]::RemoveEmptyEntries)
 
        if($item[1] -notmatch "^[\[::]")
        {           
            if (($la = $item[1] -as [ipaddress]).AddressFamily -eq "InterNetworkV6")
            {
               $localAddress = $la.IPAddressToString
               $localPort = $item[1].split("\]:")[-1]
            }
            else
            {
                $localAddress = $item[1].split(":")[0]
                $localPort = $item[1].split("::")[-1]
            } 
 
            if (($ra = $item[2] -as [ipaddress]).AddressFamily -eq "InterNetworkV6")
            {
               $remoteAddress = $ra.IPAddressToString
               $remotePort = $item[2].split("\]:")[-1]
            }
            else
            {
               $remoteAddress = $item[2].split(":")[0]
               $remotePort = $item[2].split(":")[-1]
            } 
 
            New-Object PSObject -Property @{
                PID = $item[-1]
                ProcessName = (Get-Process -Id $item[-1] -ErrorAction SilentlyContinue).Name
                Protocol = $item[0]
                LocalAddress = $localAddress
                LocalPort = $localPort
                RemoteAddress =$remoteAddress
                RemotePort = $remotePort
                State = if($item[0] -eq "tcp") {$item[3]} else {$null}
            } | Select-Object -Property $properties
        }
    }
}
 
$pth= $pwd.path + '\return.txt' 
#echo $pth
Get-NetworkStatistics |Format-Table |Out-File -FilePath $pth
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2020, 09:25
Помогаю со студенческими работами здесь

Проблема с выводом в файл
Есть код #include <stdio.h> typedef struct races { int numberRaces; char typeFlight; char destinationCiti; ...

Маленькая программка-тест, сбой с выводом информации в файл
Доброго времени суток) программа заключалась в анкетном сборе данных и дальнейшим заполнением файла полученными ответами, получилось как то...

Проблема с выводом в типизированный файл
Только начал работать с delphi 7. При выводе в типизированный файл переменной типа запись возникает проблема в приложенном скриншоте,...

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

Незадача с выводом информации
Вот задание: Используйте две переменные типа float, предложите пользователю ввести два числа и выведите на экран четыре строчки (сумма,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru