找回密码
 立即注册
搜索
查看: 4181|回复: 38

[软件] 吐槽一下微软的powershell

[复制链接]
     
发表于 2021-3-21 23:58 | 显示全部楼层 |阅读模式
本帖最后由 yikaa 于 2021-3-21 23:59 编辑

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

正常运行后出现了这样的字符:
  1.     + CategoryInfo          : NotSpecified: (2021/03/21 23:4.../localhost:8003:String) [], RemoteException
  2.     + FullyQualifiedErrorId : NativeCommandError
  3.     + PSComputerName        : localhost
复制代码

但是程序测试是正常的,这就让我摸不着头脑了。哪里来的报错呢?

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


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


  1. 2>$null
复制代码

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

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


回复

使用道具 举报

头像被屏蔽
     
发表于 2021-3-22 06:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2021-3-22 07:08 来自手机 | 显示全部楼层
这破玩意…这么多年了,连删个目录都可能删不掉,官方解决办法是先遍历再逐个删

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

使用道具 举报

     
发表于 2021-3-22 07:09 来自手机 | 显示全部楼层
不过要是2>1呢?

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

使用道具 举报

     
 楼主| 发表于 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中间进行重定向只是把刺眼的红色错误提示变成了白色的正常输出。
回复

使用道具 举报

     
 楼主| 发表于 2021-3-22 10:39 来自手机 | 显示全部楼层

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

使用道具 举报

     
发表于 2021-3-22 11:03 来自手机 | 显示全部楼层
powershell 很讨厌的是把 curl 之类的命令给映射到他自己的命令上了

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

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

使用道具 举报

     
 楼主| 发表于 2021-3-22 11:10 来自手机 | 显示全部楼层
huaxianyan 发表于 2021-3-22 11:03
powershell 很讨厌的是把 curl 之类的命令给映射到他自己的命令上了

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

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

使用道具 举报

     
发表于 2021-3-22 11:19 | 显示全部楼层
自己不规范, 往err里写日志...
回复

使用道具 举报

     
发表于 2021-3-22 11:20 | 显示全部楼层
alias这点见仁见智吧,
楼主可以试试powershell Core?
要是问题依旧的话可以提个issue啥的, ps Core的开发还是很频繁很积极的, 各种意义上.
回复

使用道具 举报

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

https://stackoverflow.com/questi ... om-external-command
这个有用么
回复

使用道具 举报

     
 楼主| 发表于 2021-3-22 11:34 来自手机 | 显示全部楼层
litel 发表于 2021-3-22 11:19
自己不规范, 往err里写日志...

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

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

使用道具 举报

     
 楼主| 发表于 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 ...

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

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

使用道具 举报

头像被屏蔽
     
发表于 2021-3-22 12:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2021-3-22 12:14 | 显示全部楼层
本帖最后由 V5Style 于 2021-3-22 12:16 编辑
huaxianyan 发表于 2021-3-22 11:03
powershell 很讨厌的是把 curl 之类的命令给映射到他自己的命令上了

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

在profile里加一句
  1. rm alias:\curl
复制代码
可以直接移除这个别名。

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

使用道具 举报

     
发表于 2021-3-22 12:28 来自手机 | 显示全部楼层
别名的 workaround 是打命令时把 .exe 带上
回复

使用道具 举报

     
发表于 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还是要单独安装的)。

评分

参与人数 1战斗力 +1 收起 理由
yikaa + 1 好评加鹅

查看全部评分

回复

使用道具 举报

     
发表于 2021-3-22 12:35 | 显示全部楼层
所以windows不是还是搞出了windows terminal了吗?
回复

使用道具 举报

     
发表于 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
回复

使用道具 举报

     
发表于 2021-3-22 12:38 | 显示全部楼层
huaxianyan 发表于 2021-3-22 12:37
终端是终端,shell 是 shell,一个是皮一个是核

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

方便你玩wsl了啊
回复

使用道具 举报

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

https://github.com/PowerShell/Po ... uecomment-669572093

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

不过得用 PS Core 7.1。我这 Windows Powershell  5.1 不知道多久能更新。
回复

使用道具 举报

     
发表于 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吧
回复

使用道具 举报

     
 楼主| 发表于 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 版本会更新么?
回复

使用道具 举报

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

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

使用道具 举报

头像被屏蔽
     
发表于 2021-3-22 13:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2021-3-22 13:41 | 显示全部楼层
V5Style 发表于 2021-3-22 12:35
建议一步到位直接上msys2。git for windows就是基于msys2构建的,git bash也是从msys2的bash衍生出来的, ...

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

使用道具 举报

     
 楼主| 发表于 2021-3-22 14:09 | 显示全部楼层
kll85757 发表于 2021-3-22 13:21
只用用git 命令感觉还行

https://git-scm.com/docs/git#Doc ... TREDIRECTSTDERRcode

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

使用道具 举报

     
发表于 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

回复

使用道具 举报

     
发表于 2021-3-22 16:51 | 显示全部楼层
yikaa 发表于 2021-3-22 11:34
https://www.zhihu.com/question/67629357

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

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

使用道具 举报

     
发表于 2021-3-22 17:20 | 显示全部楼层
DTCPSS 发表于 2021-3-22 15:46
问:这世上还有比 Windows PowerShell 启动更慢的 Shell 吗? 答:有的,PowerShell Core。  
.Net Core 服 ...

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

使用道具 举报

     
发表于 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就不错了
回复

使用道具 举报

头像被屏蔽
     
发表于 2021-3-22 21:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

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

time { PowerShell -c exit }

time { PWSH -c exit }

我这测出来 PoweShell Core 要慢一倍

回复

使用道具 举报

     
发表于 2021-3-22 22:00 | 显示全部楼层
本帖最后由 V5Style 于 2021-3-22 22:02 编辑
DTCPSS 发表于 2021-3-22 21:50
function time($block) {
    $sw = [Diagnostics.Stopwatch]::StartNew()
    &$block

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

使用道具 举报

     
发表于 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 }
回复

使用道具 举报

     
发表于 2021-3-22 22:05 | 显示全部楼层
本帖最后由 V5Style 于 2021-3-22 22:10 编辑
DTCPSS 发表于 2021-3-22 21:50
function time($block) {
    $sw = [Diagnostics.Stopwatch]::StartNew()
    &$block

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

使用道具 举报

头像被屏蔽
     
发表于 2021-3-23 01:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 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#写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-15 10:52 , Processed in 0.165171 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表