以前项目都是部署到 Centos 的 Linux 环境下的,所以对部署在 windows server 上的一些不是很熟。
给工作带来了一些不便,总想用 linux 那套命令行工具,于是就有了该篇折腾记。

该篇主要目的实际就是折腾个轻便的轻量的,能尽量用 windows 自带的工具实现查 windows server 上的 tomcat log。

实际不够轻量的各种 ssh shell 工具也都可以,只是登录的是 linux 的话一点事的都没有。
登录的是 windows server 的话,各种麻烦就来了,首当其冲就是中文乱码问题。然后就是各种直接看日志,搜索查找内容命令行都是古老的 cmd 下的命令。

大家用 Linux 的一般会用到 bash 或 Mac 下的 zsh ,和下边的一些命令行工具。那么 windows 下目前最强大的就是 powershell 了。
默认 win10 系统的 powershell 是 5.1 版本的。5.1 和 7.2.1 差别很大,参考https://docs.microsoft.com/zh-cn/powershell/scripting/whats-new/differences-from-windows-powershell?view=powershell-7.2

一、 powershell 7.2

包管理器 winget scoop choco

https://www.cnblogs.com/baiqiantao/p/8891301.html
大家用 Linux 会用到 yum 或 apt 包管理命令,Mac 下就是 homebrew 包管理命令,实际上 windows 上也有了以上三个包管理器了。

经过各种测试,折腾,建议 winget 首选,毕竟微软自家的,scoop 次选。

scoop 提供的类 linux 可在 win 环境下用的包还是很多的,常见的有如下:

🦄  scoop list
Installed apps:

  7zip 21.07 [main]
  busybox 4487-gd239d2d52 [main]
  cacert 2022-02-01 [main]
  curl 7.81.0 [main]
  gcc 11.2.0 [main]
  jq 1.6 [main]
  neovim 0.6.1 [main]
  sudo 0.2020.01.26 [main]

curl wget(wget 有独立的包,busybox 也包含 wget)等都是常用的。
neovim 就是 linux 界的编辑神器了,完全释放你的鼠标,一顿 “啪 啪 啪” 敲键盘。。。

choco 不建议。以前接触过,就是安装 nodejs 依赖工具,有个命令行工具

这玩意实际就是自动给你安装上 choco,然后安装扩展工具。但这个 choco 安装什么都需要管理员权限的 powershell,不太喜欢,后续用它安装一些包也有一些问题。

1、安装 powershell 最新版

1.1 选用 winget 方式来安装 powershell

https://docs.microsoft.com/zh-cn/windows/package-manager/winget/#production-recommended

先去系统微软应用商店搜 winget 安装即可。也可去 github 找最新的稳定发布版安装。

1.2 下图 7.2.1 既是稳定的 winget 微软官方源发布的,安装该版本


winget install --id Microsoft.Powershell --source winget 用该命令即可安装
你也可以安装下上图的最新的 Windows Terminal 。
建议您先安装最新的 Windows Terminal ,再在 Windows Terminal 下去用 winget 命令行安装 powershell7,然后 设置 powershell7 是默认启动 shell,然后再去参考本文去安装其它内容。

1.3 必要的设置与美化

主要是为了类似 bash 的提示 prompt
https://docs.microsoft.com/zh-cn/windows/terminal/tutorials/custom-prompt-setup
我就直接整理给出最后正确的命令了。

先安装字体

https://www.nerdfonts.com/font-downloads

选的这个,名叫 JetBrainsMono,因为其它 IDE 工具 vscode、IDEA 用起来也很美观。
Windows Terminal 设置中使用该字体。用该字体主要是 oh-my-posh 主题需要,否则主题会显示异常。

安装 oh-my-posh

https://ohmyposh.dev/docs/windows
winget install JanDeDobbeleer.OhMyPosh

浏览并选择一个主题
https://ohmyposh.dev/docs/themes

OhMyPosh 主题本地存放路径
C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes

本地执行 Get-PoshThemes 浏览主题效果
Archer@cmd  ~  Get-PoshThemes
Please enter the themes path: C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes

输入 $PROFILE 查询你的 PowerShell Profile 文件位置:
PowerShell 7
PS C:\Users\Archer> $PROFILE
C:\Users\Archer\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

PowerShell 5 也就是系统自带的
PS C:\Users\Archer> $PROFILE
C:\Users\Archer\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

在 PowerShell 7 执行 notepad 编辑 PROFILE
notepad $PROFILE

Import-Module oh-my-posh
oh-my-posh --init --shell pwsh --config C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes/fish.omp.json | Invoke-Expression
这样保存重启 pwh 后就基本上看到主题效果了

遇到的问题:
powershell 7 执行
Archer@cmd  ~  . $PROFILE
Import-Module: C:\Users\Archer\Documents\PowerShell\Microsoft.PowerShell_profile.ps1:1
Line |
1 | Import-Module oh-my-posh
| ~~~~~~~~~~~~~~~~~~~~~~~~
| The specified module 'oh-my-posh' was not loaded because no valid module file was found in any module directory.

在 powershell 7 下再执行下安装,可能 7 是独立的需要再执行下边命令单独安装下。
使用 PowerShell,通过以下命令安装 Oh My Posh:Install-Module oh-my-posh -Scope CurrentUser

其他插件:找的许多古老的资料安装了 posh-git,这里是教你如果装了怎么卸载干净。
Oh-My-Posh 3(目前已经是 7.多版本的了)本身已经支持 Powerline,不需要额外下载 posh-git
Install-Module posh-git -Scope CurrentUser
卸载掉 posh-git:
您必须从 C:\Users[yourUser]\Documents\WindowsPowerShell\modules 目录手动删除它。
然后编辑 notepad $PROFILE 去掉 Import-Module posh-git

安装 PSReadline 负责提示的插件

https://docs.microsoft.com/zh-cn/powershell/module/psreadline/about/about_psreadline?view=powershell-7.2
https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Core/about/about_history?view=powershell-7.2

Set-PSReadLineOption -PredictionViewStyle ListView 这个配置见下效果图里的 [history] 历史输入提示,需要安装以下版本的 PSReadLine,否则会报错。
Install-Module -Name PSReadLine -RequiredVersion 2.2.0-beta5 -AllowPrerelease
Import-Module PSReadLine

安装命令行小图标显示

Install-Module -Name Terminal-Icons -Repository PSGallery
Import-Module -Name Terminal-Icons
小图标效果图:

最后的 $Profile 内容如下

Import-Module oh-my-posh
Import-Module PSReadLine
Import-Module -Name Terminal-Icons

#oh-my-posh --init --shell pwsh --config C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes/powerlevel10k_rainbow.omp.json | Invoke-Expression
# Set-PoshPrompt powerlevel10k_rainbow slimfat
Set-PoshPrompt unicorn

#PSReadLine快捷键设置
# 设置预测文本来源为历史记录
Set-PSReadLineOption -PredictionSource History

Set-PSReadLineOption -PredictionViewStyle ListView

# 每次回溯输入历史,光标定位于输入内容末尾
Set-PSReadLineOption -HistorySearchCursorMovesToEnd

# 设置 Tab 为菜单补全和 Intellisense
Set-PSReadLineKeyHandler -Key "Tab" -Function MenuComplete

# 设置 Ctrl+d 为退出 PowerShell
Set-PSReadlineKeyHandler -Key "Ctrl+d" -Function ViExit

# 设置 Ctrl+z 为撤销
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo

# 如果你开启了 Set-PSReadLineOption -PredictionViewStyle ListView 这个选项,然后想在[History]用上下键来在历史List里上下切换的话,你需要#注释掉以下两项
#   (UpArrow 和 DownArrow),否则上下键无法进入历史listView里。
# 设置向上键为后向搜索历史记录
#Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
# 设置向下键为前向搜索历史纪录
#Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward

最终效果图:

实际上我还 安装了一些插件如:Z
Install-Module -Name Z -Force
这个东西是为了快速跳转路径用的。

如 ImportExcel 操作 Excel 的包

# 先在Powershell下执行安装模块命令Install-Module
Install-Module ImportExcel -scope CurrentUser
# 再在Powershell下执行导入包命令,然后还需要将该导入命令编辑进$Profile 配置文件下,才算成功安装一个powershell模块。所有模块的安装基本套路都是如此。
# 先Install-Module 再Import-Module,最后写配置,重启powershell。
Import-Module ImportExcel 

该命令将本机所有进程信息导入到 xlsx 下,导入成功后–Show 打开
Get-Process | Export-Excel C:\Users\Archer\Desktop\Get-Process.xlsx –Show

实际不装这个模块 ImportExcel ,poweshell 下有个默认自带的 export-csv ,这个命令和上边效果一致 Get-Process | Export-Csv –NoType C:\Users\Archer\Desktop\Get-Process.xlsx 大家可以通过 get-help -name export-excel 和 get-help -name export-csv 来查看进一步信息。

powershell 微软开源后可以在各个环境下安装了, linux 下也可以用 powershell 了,也提供了丰富的插件和许多模块 Module 来提升你的类 linux 部署和命令行操作体验。大家有时间,可以搜下高人安装的插件、模块和他们的配置参数,来优化配置自己在 win 下的操作体验。

二、tail 不中文乱码

为了找到个靠谱的 tail 可算测试了一些工具的靠谱。

unxutils 不靠谱,有个 bug 而且年代太古老了 。unxutils 2007.03.01 ---tail.exe: write error: No space left on device 实际我的磁盘空间和权限都是好的。 卸掉!

coreutils 不靠谱,安装完 使用直接有个错 tail.exe cannot be found, not a cmdlet 类似的。卸掉!

scoop install busybox                                                                                                                                            ─╯
Installing 'busybox' (4487-gd239d2d52) [64bit]
busybox-w64-FRP-4487-gd239d2d52.exe (627.5 KB) [=============================================================================================================] 100%
Checking hash of busybox-w64-FRP-4487-gd239d2d52.exe ... ok.
Linking ~\scoop\apps\busybox\current => ~\scoop\apps\busybox\4487-gd239d2d52
Creating shim for 'busybox'.
Creating shim for 'ar'.
Creating shim for 'arch'.
Creating shim for 'ash'.
Creating shim for 'awk'.
Creating shim for 'base64'.
Creating shim for 'basename'.
Creating shim for 'bash'.
Creating shim for 'bunzip2'.
Creating shim for 'bzcat'.
Creating shim for 'bzip2'.
Creating shim for 'cal'.
Creating shim for 'cat'.
Creating shim for 'chmod'.
Creating shim for 'cksum'.
Creating shim for 'clear'.
Creating shim for 'cmp'.
Creating shim for 'comm'.
Creating shim for 'cp'.
Creating shim for 'cpio'.
Creating shim for 'cut'.
Creating shim for 'date'.
Creating shim for 'dc'.
Creating shim for 'dd'.
Creating shim for 'df'.
Creating shim for 'diff'.
Creating shim for 'dirname'.
Creating shim for 'dos2unix'.
Creating shim for 'dpkg'.
Creating shim for 'dpkg-deb'.
Creating shim for 'du'.
Creating shim for 'echo'.
Creating shim for 'ed'.
Creating shim for 'egrep'.
Creating shim for 'env'.
Creating shim for 'expand'.
Creating shim for 'expr'.
Creating shim for 'factor'.
Creating shim for 'false'.
Creating shim for 'fgrep'.
Creating shim for 'find'.
Creating shim for 'fold'.
Creating shim for 'fsync'.
Creating shim for 'ftpget'.
Creating shim for 'ftpput'.
Creating shim for 'getopt'.
Creating shim for 'grep'.
Creating shim for 'groups'.
Creating shim for 'gunzip'.
Creating shim for 'gzip'.
Creating shim for 'hd'.
Creating shim for 'head'.
Creating shim for 'hexdump'.
Creating shim for 'httpd'.
Creating shim for 'iconv'.
Creating shim for 'id'.
Creating shim for 'ipcalc'.
Creating shim for 'kill'.
Creating shim for 'killall'.
Creating shim for 'less'.
Creating shim for 'link'.
Creating shim for 'ln'.
Creating shim for 'logname'.
Creating shim for 'ls'.
Creating shim for 'lzcat'.
Creating shim for 'lzma'.
Creating shim for 'lzop'.
Creating shim for 'lzopcat'.
Creating shim for 'man'.
Creating shim for 'md5sum'.
Creating shim for 'mkdir'.
Creating shim for 'mktemp'.
Creating shim for 'mv'.
Creating shim for 'nc'.
Creating shim for 'nl'.
Creating shim for 'od'.
Creating shim for 'paste'.
Creating shim for 'patch'.
Creating shim for 'pgrep'.
Creating shim for 'pidof'.
Creating shim for 'pipe_progress'.
Creating shim for 'pkill'.
Creating shim for 'printenv'.
Creating shim for 'printf'.
Creating shim for 'ps'.
Creating shim for 'pwd'.
Creating shim for 'readlink'.
Creating shim for 'realpath'.
Creating shim for 'reset'.
Creating shim for 'rev'.
Creating shim for 'rm'.
Creating shim for 'rmdir'.
Creating shim for 'rpm'.
Creating shim for 'rpm2cpio'.
Creating shim for 'sed'.
Creating shim for 'seq'.
Creating shim for 'sh'.
Creating shim for 'sha1sum'.
Creating shim for 'sha256sum'.
Creating shim for 'sha3sum'.
Creating shim for 'sha512sum'.
Creating shim for 'shred'.
Creating shim for 'shuf'.
Creating shim for 'sleep'.
Creating shim for 'sort'.
Creating shim for 'split'.
Creating shim for 'ssl_client'.
Creating shim for 'stat'.
Creating shim for 'strings'.
Creating shim for 'su'.
Creating shim for 'sum'.
Creating shim for 'tac'.
Creating shim for 'tail'.
Creating shim for 'tar'.
Creating shim for 'tee'.
Creating shim for 'test'.
Creating shim for 'time'.
Creating shim for 'timeout'.
Creating shim for 'touch'.
Creating shim for 'tr'.
Creating shim for 'true'.
Creating shim for 'truncate'.
Creating shim for 'ts'.
Creating shim for 'ttysize'.
Creating shim for 'uname'.
Creating shim for 'uncompress'.
Creating shim for 'unexpand'.
Creating shim for 'uniq'.
Creating shim for 'unix2dos'.
Creating shim for 'unlink'.
Creating shim for 'unlzma'.
Creating shim for 'unlzop'.
Creating shim for 'unxz'.
Creating shim for 'unzip'.
Creating shim for 'usleep'.
Creating shim for 'uudecode'.
Creating shim for 'uuencode'.
Creating shim for 'vi'.
Creating shim for 'watch'.
Creating shim for 'wc'.
Creating shim for 'wget'.
Creating shim for 'which'.
Creating shim for 'whoami'.
Creating shim for 'whois'.
Creating shim for 'xargs'.
Creating shim for 'xxd'.
Creating shim for 'xz'.
Creating shim for 'xzcat'.
Creating shim for 'yes'.
Creating shim for 'zcat'.
Running post-install script...
INFO  creating ~/.profile
'busybox' (4487-gd239d2d52) was installed successfully!

最终这个比较靠谱,tail 可以用了,但是中文是乱码。查看帮助 tail --help 也没有类似控制编码的参数。 卸掉!!!实际大家可以试试 busybox 其他的,这个还是比较全的和稳的。可以直接在 Powershell 下用上这些类 Linux 的还是比较美的。

最终,还是想到了 git-bash,这玩意儿。。。

这东西还是稳,自带了一些类似的 linux 命令行工具。本地找了个中文的 log 测试了下 tail -f 是无中文乱码的。

可以直接在 powershell 中切换到该 bash。

三 查看远程 windows server 上的 tomcat log

直接 Powshell ssh 登录到远程某一 windows server 服务器。
ssh 的配置 参考:https://cloud.tencent.com/developer/article/1420930
ssh 默认登录的是远程机器上的 cmd 或 terminal 需要输入 Powershell 来切换到远程机器上的 powershell。
然后就可以直接用 3.1 节的 pwh 自带的 Get-Content Select-String 这些。

3.1 直接用 Powershell 自带的命令行,我直接整理如下:

实际也排了许多坑,-Encoding utf8 比如这个 不带还是输出中文乱码的,网上有许多解决方案,都不靠谱。
比如 https://www.lovesofttech.com/windows/win10CmdCharacter.html 这种都太复杂且破坏系统了,不够轻量。
最后查到官方文档 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.2
提供了参数 -Encoding utf8 可惜 busybox 下的 tail 是不提供该输出内容编码参数的,所以。。。。我卸载了 busybox 和类似的 coreutils。

大家如果再轻便些,实际可以直接用以下命令来 实现 tail -f grep 等类似效果,就是命令太难记。

powershell  查看实时滚动日志:
Get-Content .\all.log  -Tail 20 -wait   -Encoding utf8
Get-Content .\error.log  -Tail 20 -wait   -Encoding utf8

powershell 解压:
.zip 
Expand-Archive -Path  *.zip

.gz 
https://scatteredcode.net/download-and-extract-gzip-tar-with-powershell/   
你们看看解压都这么麻烦,powershell下居然没有类似 tar -zxvf *.gz 的命令。

powershell  搜索内容:
https://blog.csdn.net/sinat_41104353/article/details/83046182
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?WT.mc_id=thomasmaurer-blog-thmaure&view=powershell-7.2

文件中搜索字符串
select-string -pattern "exception"  .\all.log

匹配正则
Select-String -Pattern "EX.*E"  .\all.log

查看匹配项的前2行
Select-String -Pattern "exception" - Context 2,0 .\all.log

查看匹配项的后3行
Select-String -Pattern "exception" -Context 0,3 .\all.log

查看匹配前2行和匹配后3行
Select-String -Pattern "exception" -Context 2,3 .\all.log

匹配整个单词。给定的搜索词或字符串会部分或全部显示。 如果我们需要匹配被空格包围的整个单词,则应在搜索词前后加上空格。 我们将把exception搜索词作为一个整体进行搜索。
Select-String -Pattern " exception " .\all.log

递归搜索文件。 递归搜索将在所有当前文件夹和子文件夹中查找给定的字符串。
Get-ChildItem -Path 文件路径 -Recurse | select-string -pattern "模式"
Get-ChildItem c:\*.txt -Recurse | Select-String -Pattern EX

Get-ChildItem -Path .\all.log  -Recurse | select-string -pattern "01-21 15:4"

Get-ChildItem -Path .\all.log  -Recurse | select-string -pattern "exception"

重定向输出到文件:
select-string -pattern "exception"  .\all.log  |  Out-File exception.log -Encoding utf8

select-string -pattern " Lock wait " -Context 9,9  .\all.log  |  Out-File exception.log -Encoding utf8
select-string -pattern " exception " -Context 9,9  .\all.log  |  Out-File exception.log -Encoding utf8

Get-ChildItem -Path .\all.log  -Recurse | select-string -pattern "exception"   |  Out-File exception.log -Encoding utf8 


过滤搜索关键词:
exception    Deadlock   Lock    timeout  

3.2 用类 linux 命令来查

上述命令好是好,也满足了需求,可是比起以前的 linux 的,我记不住啊。而且远程上的 powershell 不可以乱部署 美化部分的内容和装一些插件。
好就好在,远程的 windows server 上边有部署 git,那按照二的思路,我可以在远程上的 powershell 切换到远程机器上的 git-bash 吗?
答案是可以的。
见图 我由远程的 ps 找到 bash 就可以切换到远程机器上的 bash 了。

2022-02-14 草草编辑完。没有 markdown 排版。但看还是能看的。给排掉了许多坑。应该可以照抄直接用。
目录大纲,没的选,只能选 linux 下边。实际应该有个 工具配置 类似的板块。管理员看到了,可以帮我转移下。


↙↙↙阅读原文可查看相关链接,并与作者交流