Преобразование сценария оболочки в PowerShell - PullRequest
1 голос
/ 29 мая 2019

После переключения приложения с Linux на Windows мне нужно преобразовать сценарий оболочки в эквивалент Windows.В основном я выбирал пакетную версию и PowerShell, и я решил попробовать PowerShell.

Для всех, кто интересуется, это локальная проверка Check_MK для получения информации об установленной версии SoftEther и количестве сеансов с данными о производительности.

Первоначальный сценарий оболочки был следующим:

#!/bin/sh
cmd=$(/usr/local/vpnserver/vpncmd localhost:port /server /password:password /in:/usr/lib/check_mk_agent/local/vpncmd.txt)
version=$(echo "$cmd" | head -4 | tail -1)
sessions=$(echo "$cmd" | grep Sessions | awk '$1=$1' | cut -c21-22)

if [ -z "$version" ]; then
 echo "3 VPN_Version - Can't get the information from vpncmd"
else
 echo "0 VPN_Version - SoftEther VPN Server $version"
fi

if [ -z "$sessions" ]; then
 echo "3 VPN_Sessions - Can't get the information from vpncmd"
else
 echo "P VPN_Sessions sessions=$sessions;2;2"
fi

В основном все работает, кроме двух самых сложных строк кода:

cd "C:\Program Files\SoftEther VPN Server"
$cmd = vpncmd localhost:port /server /password:password /in:vpncmd.txt
$version=
$sessions=

if($version -eq $null) {
    echo "3 VPN_Version - Can't get the information from vpncmd"
} else {
    echo "0 VPN_Version - SoftEther VPN Server $version"
}

if($sessions -eq $null) {
    echo "3 VPN_Sessions - Can't get the information from vpncmd"
} else {
    echo "P VPN_Sessions sessions=$sessions;2;2"
}

Мне нужна помощь с переходом отhead, tail, grep, awk и cut один вкладыш к тому, что эквивалентно в PowerShell.Я читал о Get-Content, но я не уверен, что это самый эффективный способ сделать это, и хотел бы не переходить от определения 1 строки к 10 строкам, если это возможно, чтобы быть настолько эффективным в PowerShell.

Пример вывода vpncmd: https://pastebin.com/J5FcHzHK

1 Ответ

1 голос
/ 29 мая 2019

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

$Version = ($Vpncmd_Output -match '^Version \d{1,}\.\d{1,}' -split 'Version ' )[-1].Trim()
$SessionCount = [int]($Vpncmd_Output -match 'Number of Sessions\s+\|').Split('|')[-1].Trim()

$Version
$SessionCount

вывод ...

4.29 Build 9680   (English)
0

используя данные в вашем посте PasteBin и предполагая, что это многострочная строка, а не массив строк, это похоже на работу [ grin ] ...

$Vpncmd_Output -match '(?m)Number of Sessions\s+\|(?<Sessions>.*)'
$Matches.Sessions
# output = 0
$Vpncmd_Output -match '(?m)Version (?<Version>.+)'
$Matches.Version
# output = 4.29 Build 9680   (English)

Я пытался объединить регулярное выражение в одно, но безуспешно. [ румянец ] так, как он у меня, требует двух проходов, но это работает.

...