yikaa 发表于 2021-3-21 23:58

吐槽一下微软的powershell

本帖最后由 yikaa 于 2021-3-21 23:59 编辑

写了个小程序,然后突发奇想准备用 Powershell 脚本来测试的,结果没想到遇到了微软式的 Feature。

正常运行后出现了这样的字符:
    + CategoryInfo          : NotSpecified: (2021/03/21 23:4.../localhost:8003:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
    + PSComputerName      : localhost
但是程序测试是正常的,这就让我摸不着头脑了。哪里来的报错呢?

于是一通搜索之后才发现这是微软式的 It`s a feature not a bug 。简单地说就是当 stderr 被写入的时候 微软就认为你是报错了, 所以就用这样的字符来进行错误提示。


但是实际上写入 stderr 的不一定是错误信息,还可能是 log 这类的日志信息。如果你需要正常地显示 log 的话,你得在程序里面把 log 重定向到 stdout。如果只是在 Powershell 里面重定向的话


2>$null
会把你的 log 也搞掉。。。这就有点让人蛋疼了。为了你 Powershell 我还得改代码??

最后还是吐槽一句,让微软的归微软,让 Linux 的归 Linux 。写脚本我还是用 bash 吧。


sdefrfg 发表于 2021-3-22 06:57

EraserKing 发表于 2021-3-22 07:08

这破玩意…这么多年了,连删个目录都可能删不掉,官方解决办法是先遍历再逐个删

— from Xiaomi MIX 2S, Android 10 of S1 Next Goose v2.4.4

EraserKing 发表于 2021-3-22 07:09

不过要是2>1呢?

— from Xiaomi MIX 2S, Android 10 of S1 Next Goose v2.4.4

yikaa 发表于 2021-3-22 10:37

EraserKing 发表于 2021-3-22 07:09
不过要是2>1呢?

— from Xiaomi MIX 2S, Android 10 of S1 Next Goose v2.4.4

一样的,因为写入到stderr是程序的行为。 在ps中间进行重定向只是把刺眼的红色错误提示变成了白色的正常输出。

yikaa 发表于 2021-3-22 10:39

sdefrfg 发表于 2021-3-22 06:57
WSL不香吗

所以我用 windows terminal + git bash 。 git 安装的时候还附带了些常用的软件挺不错的。

huaxianyan 发表于 2021-3-22 11:03

powershell 很讨厌的是把 curl 之类的命令给映射到他自己的命令上了

导致我装了 curl 还要 alias 别的来用

—— 来自 Google Pixel 5, Android 11上的 S1Next-鹅版 v2.4.3

yikaa 发表于 2021-3-22 11:10

huaxianyan 发表于 2021-3-22 11:03
powershell 很讨厌的是把 curl 之类的命令给映射到他自己的命令上了

导致我装了 curl 还要 alias 别的来用 ...

对 这个我测试的时候也发现了。感觉就是在出其不意的地方给你塞一坨屎。

litel 发表于 2021-3-22 11:19

自己不规范, 往err里写日志...

冰箱研会长e-3M 发表于 2021-3-22 11:20

alias这点见仁见智吧,
楼主可以试试powershell Core?
要是问题依旧的话可以提个issue啥的, ps Core的开发还是很频繁很积极的, 各种意义上.

EraserKing 发表于 2021-3-22 11:22

yikaa 发表于 2021-3-22 10:37
一样的,因为写入到stderr是程序的行为。 在ps中间进行重定向只是把刺眼的红色错误提示变成了白色的正常 ...

https://stackoverflow.com/questions/59366288/dont-throw-powershell-exception-on-writes-to-stderr-from-external-command
这个有用么

yikaa 发表于 2021-3-22 11:34

litel 发表于 2021-3-22 11:19
自己不规范, 往err里写日志...

https://www.zhihu.com/question/67629357

我觉得往 err 写日志是没错的。你把 log 写到 stdout 了,pipeline 还得区分一次是程序正常输出还是 log 信息。

yikaa 发表于 2021-3-22 11:53

EraserKing 发表于 2021-3-22 11:22
https://stackoverflow.com/questions/59366288/dont-throw-powershell-exception-on-writes-to-stderr-f ...

我就是他说的无法避免的后台作业的问题。因为我是同时开多个服务节点测试,所以需要并行地开启执行多个程序

这个时候还是一样的。当然如果只是单个程序的话,确实没有这样的问题。

whzfjk 发表于 2021-3-22 12:08

V5Style 发表于 2021-3-22 12:14

本帖最后由 V5Style 于 2021-3-22 12:16 编辑

huaxianyan 发表于 2021-3-22 11:03
powershell 很讨厌的是把 curl 之类的命令给映射到他自己的命令上了

导致我装了 curl 还要 alias 别的来用 ...
在profile里加一句
rm alias:\curl可以直接移除这个别名。

PowerShell Core里面已经没有这个别名了。但是从Windows 10 1803开始,系统会在system32下自带一个curl,所以即便没有这个别名,用的curl依然不是自己安装的而是自带的,除非改环境变量提高优先级,或者用Dism直接移除相关包。

DTCPSS 发表于 2021-3-22 12:28

别名的 workaround 是打命令时把 .exe 带上

V5Style 发表于 2021-3-22 12:35

yikaa 发表于 2021-3-22 10:39
所以我用 windows terminal + git bash 。 git 安装的时候还附带了些常用的软件挺不错的。 ...

建议一步到位直接上msys2。git for windows就是基于msys2构建的,git bash也是从msys2的bash衍生出来的,但是msys2还有包管理器。
现在在用msys2管理mingw64的程序,并且把mingw64二进制程序目录拉进环境变量,这样cmd/PowerShell里也能用file之类的程序了(没有mingw64的git,git for windows还是要单独安装的)。

happydog 发表于 2021-3-22 12:35

所以windows不是还是搞出了windows terminal了吗?

huaxianyan 发表于 2021-3-22 12:37

happydog 发表于 2021-3-22 12:35
所以windows不是还是搞出了windows terminal了吗?

终端是终端,shell 是 shell,一个是皮一个是核

—— 来自 Google Pixel 5, Android 11上的 S1Next-鹅版 v2.4.3

happydog 发表于 2021-3-22 12:38

huaxianyan 发表于 2021-3-22 12:37
终端是终端,shell 是 shell,一个是皮一个是核

—— 来自 Google Pixel 5, Android 11上的 S1Next-鹅版 ...

方便你玩wsl了啊

yikaa 发表于 2021-3-22 12:40

冰箱研会长e-3M 发表于 2021-3-22 11:20
alias这点见仁见智吧,
楼主可以试试powershell Core?
要是问题依旧的话可以提个issue啥的, ps Core的开发 ...

https://github.com/PowerShell/PowerShell/issues/3996#issuecomment-669572093

翻查了一通终于找到了解决,这个 issue 真长。

不过得用 PS Core 7.1。我这 Windows Powershell5.1 不知道多久能更新。

冰箱研会长e-3M 发表于 2021-3-22 12:42

yikaa 发表于 2021-3-22 12:40
https://github.com/PowerShell/PowerShell/issues/3996#issuecomment-669572093

翻查了一通终于找到了 ...

兄弟 5.1都终止开发了吧...
现在就6.X 和7.X在更新
直接一步到位PWSH 7.X CORE吧

yikaa 发表于 2021-3-22 13:03

冰箱研会长e-3M 发表于 2021-3-22 12:42
兄弟 5.1都终止开发了吧...
现在就6.X 和7.X在更新
直接一步到位PWSH 7.X CORE吧 ...

我也是突发奇想想用 PS 写一下而已,毕竟系统自带的一直没怎么用过。专门升级一下平时不用的东西感觉没啥必要

所以以后 Windows 内置的 PS 版本会更新么?

冰箱研会长e-3M 发表于 2021-3-22 13:12

yikaa 发表于 2021-3-22 13:03
我也是突发奇想想用 PS 写一下而已,毕竟系统自带的一直没怎么用过。专门升级一下平时不用的东西感觉没啥 ...

我觉得难, powershell 5.1 是win10底层的一部分, 移除5.1替换为7.x...短期内看不现实
估计下一代windows能实现吧(

kll85757 发表于 2021-3-22 13:21

yikaa 发表于 2021-3-22 13:41

V5Style 发表于 2021-3-22 12:35
建议一步到位直接上msys2。git for windows就是基于msys2构建的,git bash也是从msys2的bash衍生出来的, ...

看了一下感觉现在我对 Windows 上的 Linux 环境需求还没有那么大。以后可能会再试试,先 Mark 了

yikaa 发表于 2021-3-22 14:09

kll85757 发表于 2021-3-22 13:21
只用用git 命令感觉还行

https://git-scm.com/docs/git#Documentation/git.txt-codeGITREDIRECTSTDERRcode

因为 Git 注意到了 Powershell 的这一智障设置,所以添加了一个重定向的功能。改变自己来适应 Powershell

DTCPSS 发表于 2021-3-22 15:46

P

本帖最后由 DTCPSS 于 2021-3-22 15:47 编辑

问:这世上还有比 Windows PowerShell 启动更慢的 Shell 吗? 答:有的,PowerShell Core。
.Net Core 服务端的性能跑分一直在提升,但是 PS Core 的启动速度实在是慢。所以尽管 PS Core 比老 PS 有了不少改进,我的默认 Shell 还是用 Windows PowerShell

litel 发表于 2021-3-22 16:51

yikaa 发表于 2021-3-22 11:34
https://www.zhihu.com/question/67629357

我觉得往 err 写日志是没错的。你把 log 写到 stdout 了,pip ...

丢日志系统或者单独的日志文件吧...

冰箱研会长e-3M 发表于 2021-3-22 17:20

DTCPSS 发表于 2021-3-22 15:46
问:这世上还有比 Windows PowerShell 启动更慢的 Shell 吗? 答:有的,PowerShell Core。
.Net Core 服 ...

2333 我现在Core有16个模块, 启动速度基本在600ms左右

V5Style 发表于 2021-3-22 21:12

DTCPSS 发表于 2021-3-22 15:46
问:这世上还有比 Windows PowerShell 启动更慢的 Shell 吗? 答:有的,PowerShell Core。
.Net Core 服 ...

我觉得PowerShell Core快多了。PowerShell Core基本上启动10次可以有5次不超过500ms,Windows PowerShell启动10次能有1次不超过500ms就不错了

112358 发表于 2021-3-22 21:33

DTCPSS 发表于 2021-3-22 21:50

V5Style 发表于 2021-3-22 21:12
我觉得PowerShell Core快多了。PowerShell Core基本上启动10次可以有5次不超过500ms,Windows PowerShell ...

function time($block) {
    $sw = ::StartNew()
    &$block
    $sw.Stop()
    $sw.Elapsed
}

time { PowerShell -c exit }

time { PWSH -c exit }

我这测出来 PoweShell Core 要慢一倍

V5Style 发表于 2021-3-22 22:00

本帖最后由 V5Style 于 2021-3-22 22:02 编辑

DTCPSS 发表于 2021-3-22 21:50
function time($block) {
    $sw = ::StartNew()
    &$block

我这边 PowerShell Core 比 Windows PowerShell 慢 0.1s。
PowerShell Core是不是加载模块速度快但是启动速度慢?

DTCPSS 发表于 2021-3-22 22:05

V5Style 发表于 2021-3-22 22:00
我这边 PowerShell Core 比 Windows PowerShell 慢 0.1s。
PowerShell Core是不是加载模块速度快但 ...

我觉得应该是,你可以试一下:
time { PowerShell -NoProfile -c exit }
time { PWSH -NoProfile -c exit }

V5Style 发表于 2021-3-22 22:05

本帖最后由 V5Style 于 2021-3-22 22:10 编辑

DTCPSS 发表于 2021-3-22 21:50
function time($block) {
    $sw = ::StartNew()
    &$block

把profile删了重新测试了一遍,现在PowerShell Core只要0.35s,而Windows PowerShell要0.7s,应该是模块的问题。
忘了把 Windows PowerShell 的profile删了,重新测了一遍。
现在 Windows PowerShell 只要0.15s,而 PowerShell Core 要0.3s。

cqkxywj 发表于 2021-3-23 01:05

r_ex 发表于 2021-3-23 02:30

之前本来有一组跨平台的脚本考虑过PowerShell,后来发现写法很麻烦,就直接上C#了。只要搞定文件夹切换、路径计算写法、调用程序,C#也是脚本。

—— 来自 BlackBerry BBF100-4, Android 8.1.0上的 S1Next-鹅版 v2.1.2

風舞雪 发表于 2021-3-23 04:50

楼上说的是对的 直接用c#写
页: [1]
查看完整版本: 吐槽一下微软的powershell