win10 的 cmd 的标准输出卡死 bug

2017-03-29 17:01:59 +08:00
 gouchaoer

就我的经验而言,我阿里云的 win server 2012 的 powershell , win10 的 cmd 都存在标准输出卡死的问题,用 docker 的时候出现,现在我在一台 win10 的 cmd 里运行 php-cli 也存在这个 bug 。一旦卡住,你就需要切到该 cmd 中,然后按一下回车,好了。。。。

cmd 是基础设施,这么傻逼的 bug 简直丧心病狂,而且这么一搞我的个人应用就没法跑了。。。

win10 垃圾,我丝毫没有感受到 win10 对 win7 有什么改进,倒是一堆垃圾 feature , win7 还可以战斗 20 年!

16970 次点击
所在节点    PowerShell
36 条回复
weiceshi
2017-03-29 21:49:29 +08:00
@Quaintjade

powershell 的 required 参数有个属性叫做 position ,固定参数可以免参数名
比如 Add-VpnConnection 有两个固定参数, -Name 和 -ServerAddress 的 position 分别是 1 和 2
那么在不指定参数名称的情况下,出现的第一个 value 被指定到 Name ,同理第二个参数被指定到 ServerAddress (假如已经指定了 ServerName 的参数名,那么顺延)

所以拿你的命令行举例:
Add-VpnConnection -Name "TestVPN" -TunnelType Ikev2 -SplitTunneling $False -PassThru
$False 并不是赋给了 SplitTunneling ,而是作为未指定参数名的第一个 value 出现的
因为已经指定了 Name ,所以$False 被赋给了参数 ServerAddress
所以你的命令行并不是 [为什么带了值也不报错] ,而是相当于: Add-VpnConnection -Name "TestVPN" -TunnelType Ikev2 -SplitTunneling -ServerAddress $False -PassThru
如果你再添加一个未指定参数名的 value ,就会报错了,因为没有第三个 required 参数。
所以继续然而并没有

ps :其实这种基本知识,你用两遍就应该知道了。自己获取知识的能力对于码农来说是最重要的了
KirkZheng
2017-03-29 21:49:32 +08:00
我倒是认为 win10 有很大的改进,设计哲学深得我心,各种同步。
Quaintjade
2017-03-29 22:02:31 +08:00
@Quaintjade
我自问自答一下吧。
不报错是因为 PowerShell 里必需参数和可选参数、位置参数和命名参数的顺序可以随便混的绝赞 feature ,结果就是你以为是一个参数名+参数值的组合, PowerShell 却认为是一个无值的命名参数+一个必需参数的值(或一个可省略名称的命名参数的值)。恰好这个参数值又是字符串型的,于是$False 自动转成字符串, gg

当然还有更倒霉的情况,例如你输了 false 而对应位置参数正好接受 boolean ,你粗扫一眼看到报错提示 boolean 值应该写$False ,然后你改成$False 就不报错了

PS C:\> Add-VpnConnection -Name "TestVPN" -ServerAddress "1.2.3.4" -TunnelType Ikev2 -EncryptionLevel "Required" -AuthenticationMethod "eap" -SplitTunneling False -PassThru

Add-VpnConnection : Cannot process argument transformation on parameter 'AllUserConnection'. Cannot convert value "System.String" to type "System.Management.Automation.SwitchParameter". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
At line:1 char:150
+ ... "Required" -AuthenticationMethod "eap" -SplitTunneling False -PassTh ...
+ ~~~~~
Quaintjade
2017-03-29 22:14:26 +08:00
@weiceshi
已经发现了,然而同样是巨硬家的 C#就不允许这种参数顺序混乱的 feature 。
https://msdn.microsoft.com/en-us/library/dd264739.aspx

另外技术文档依然继续坑人,比如告诉你的 synopsis 是:
Add-VpnConnection [-Name] <String> [-ServerAddress] <String> [[-TunnelType] <String>] [-AllUserConnection]
[-RememberCredential] [-SplitTunneling] [-Force] [-PassThru] [[-L2tpPsk] <String>] [-UseWinlogonCredential]
[-ServerList <CimInstance[]>] [-DnsSuffix <String>] [-IdleDisconnectSeconds <UInt32>]
[[-EapConfigXmlStream] <XmlDocument>] [[-AuthenticationMethod] <String[]>] [[-EncryptionLevel] <String>]
[-MachineCertificateIssuerFilter <X509Certificate2>] [-MachineCertificateEKUFilter <String[]>]
[-CimSession <CimSession[]>] [-ThrottleLimit <Int32>] [-AsJob] [-WhatIf] [-Confirm] [<CommonParameters>]

你看到有三个参数的顺序是 -AllUserConnection ,-AuthenticationMethod ,-EncryptionLevel
然而你只有查看了具体的 position 属性之后才会发现它们的顺序其实是 -EncryptionLevel(4), -AuthenticationMethod(5), -AllUserConnection(7)


是的,你可以主张这都是 feature ,而且你都写了文档了。然而这些都是违反基本知识(或者说常识)的坑,说白了还是 MDZZ 。
我哪天写个命令的参数,名称叫 -EnableX ,实际上用处却是禁用 X ,并且在详细文档中正确地注明用处就是禁用,那么那些上当的人都是自己不看文档的错对吧?
manhere
2017-03-29 22:16:03 +08:00
一直用管道方式执行,未发现这个问题
gouchaoer
2017-03-29 22:20:51 +08:00
@uuair 那种 adsl 拨号的 vps 就是,基本 xp 和 win7 系统,不会卡
weiceshi
2017-03-29 22:26:56 +08:00
@Quaintjade
不要打滚了,错就错了好不好。
微软给小白用户准备了 powershell ise , cortana 里直接搜就有,打开后右边窗口搜索命令,然后可视化编辑参数,勾勾点点然后点执行就好,绝不出错。
ragnaroks
2017-03-29 22:33:18 +08:00
我在 ise 里面确实没遇到过问题,主要是 cmd-let 太多了,记不住,猜也经常猜错
@weiceshi #27
jsq2627
2017-03-29 22:33:43 +08:00
1. 终端和 shell 要区分看来看。 cmd 和 powershell 是 shell ,那个难用的窗口是终端,吐槽 win 命令行难用的大都是吐槽终端难用。
2. 楼主提的问题,熟悉 win 的人一眼就知道是鼠标点了某个地方选中了文本。右键窗口标题,属性,把快速编辑模式关掉就能避免这个问题。
3. powershell 的设计哲学和 Linux 下的 shell 非常不一样,配合好一点的编辑器或者 IDE 会写的很爽,直接在终端敲是很幸苦很容易出错的。
4. 受不了原生 conhost 可以试试 conemu 或者 cmder ,做了很多改进,再不行还有 cygmin/MSYS minty 能用。看楼主的需求是服务器应用,那正确的做法是安装成 windows service 来跑。
5. 楼主感受不到 win10 相比 win7 对开发者有什么变化,是因为没有进行 windows / .net 相关的开发。对于一个 windows 平台上的开发者相信也是感受不到 Ubuntu 16.04 和 14.04 有什么区别的。
6. windows 是比 *nix 更难掌控的一个平台,有问题勿喷,尝试了解它的哲学,有 bug 去反馈,觉得自己牛那就造轮子来改善这个世界。何必发牢骚,自己不爽,看了的人也不爽。
Quaintjade
2017-03-29 22:43:33 +08:00
@weiceshi
powershell ise 直接新建一个.ps1 文件,然后右键 edit 就有。我一般直接编辑命令 /参数,用 tab 自动完成。

你说我不看文档理解错了,这没问题,我承认。然而我并没有打滚。
我说过了微软大可以搞各种 ZZ 的反常识的 feature ,并在技术文档里详细地描述这些 feature ,然而 ZZ 就是 ZZ 。常识本该可以节省学习时间,而不该花更多时间去学习反常识的所谓“基本知识”、重新踩各种基本的坑。
Quaintjade
2017-03-29 22:50:01 +08:00
@jsq2627
我想说我上面犯的错就是因为我把.Net 和查阅 MSDN 的习惯想当然地套用到 PowerShell 上,于是就掉坑了……
xrlin
2017-03-29 23:02:20 +08:00
以前也很头疼这个问题,貌似设置下终端关闭快速编辑模式就可以解决
lazycat
2017-03-30 07:32:47 +08:00
感觉这是高级爬虫工程师被黑的最惨的一次
vvv123
2017-06-03 10:58:02 +08:00
@gouchaoer #17 “高级爬虫工程师”是楼主自封的吗?你搞程序不用谷歌,搞毛啊。百度只是全球最大的中文搜索引擎,而程序是洋人发明的,像你这么“高端”的问题百度能解决就奇怪了。
当年我为了搜索一个基本的 Win32 问题,百度搜出来的结果相当少,主要都是国内网站。可是 E 文类似的问题已经问过很多遍了,用国外搜索引擎搜索都一大堆,而且针对性很强。
gouchaoer
2017-06-03 12:20:45 +08:00
@vvv123 我是国内少有的高级爬虫开发工程师,看我 offer:

英语太难了,翻墙太难了,为什么你们能把那么难的工具用的那么舒服丫?

“程序是洋人发明的”,既然英语那么好那你一定喜欢混 hacker news、reddit programming 咯,干嘛上 v2ec 中文社区丫
fangxing204
2020-10-16 12:14:52 +08:00
Quick edit mode?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/351238

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX