将应用程序从Linux切换到Windows后,我需要将Shell脚本转换为Windows等效脚本。我的选择基本上是批处理和PowerShell,因此我决定尝试使用PowerShell。
对于有兴趣的人,这是Check_MK的本地检查,以获取有关SoftEther安装版本以及具有性能数据的会话数的信息。
最初的shell脚本如下:
#!/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
的文章,但是我不确定这是否是最有效的方法,如果在PowerShell中可能行得通,我想避免从1行定义变为10行。
vpncmd
的输出示例输出:https://pastebin.com/J5FcHzHK
答案 0 :(得分:1)
由于数据是行的数组并且单词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帖子中的数据,并假设它是多行字符串,而不是字符串数组,这似乎可以[[em> grin ] ... < / p>
$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)
我尝试将正则表达式合并为一个,但是失败了。 [ blush ]我拥有它的方式需要两次通过,但它确实有效。