首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gouchaoer
V2EX  ›  PowerShell

win10 的 cmd 的标准输出卡死 bug

  •  
  •   gouchaoer · 2017-03-29 17:01:59 +08:00 · 11669 次点击
    这是一个创建于 1030 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    35 回复  |  直到 2017-06-03 12:20:45 +08:00
    gouchaoer
        1
    gouchaoer   2017-03-29 17:02:50 +08:00
    这个 bug 怎么修呢,现在我业务没法跑啊
    jjx
        2
    jjx   2017-03-29 17:08:00 +08:00
    现在 windows 10 中用 git submodule foreach git pull origin master 时 也发现这个情况, 按一下回车就继续了
    gouchaoer
        3
    gouchaoer   2017-03-29 17:13:50 +08:00
    @jjx 我没发按回车啊,我的 cmd 程序有业务一直都在跑,这么一卡死就 stop the world forever 了。。。。。。。。为什么微软这么傻逼?这种 bug 如果说 win10 是消费者的,那为啥 win server2012 的 powershell 也存在这个问题?谁能告诉我为什么微软这么傻逼?做个系统越做越烂
    Yuwen
        4
    Yuwen   2017-03-29 17:26:39 +08:00 via Android
    没记错的话 win10 很早测试版上就一直存在
    laxenade
        5
    laxenade   2017-03-29 17:30:17 +08:00
    从来没遇到过呢 不如试试 2016 吧(逃
    webjin1
        6
    webjin1   2017-03-29 17:30:39 +08:00 via Android
    中文输入法导致的吗?
    wohenyingyu02
        7
    wohenyingyu02   2017-03-29 17:30:46 +08:00
    同样遇到,据说是选中问题

    https://www.v2ex.com/t/345192
    Quaintjade
        8
    Quaintjade   2017-03-29 17:46:48 +08:00
    Bug 10 就是个一团败絮的系统,除了给小白用的基本功能,稍微高级些的功能都是各种脑残 bug ,正式版的稳定度连 beta 都达不到。

    PowerShell 参数明确指定$False 结果却是$True 这种傻缺错误都有:
    > Add-VpnConnection -Name "TestVPN" -TunnelType Ikev2 -SplitTunneling $False -PassThru
    SplitTunneling : True

    http://image18.poco.cn/mypoco/myphoto/20170327/22/5657397520170327224548078.jpg
    Osk
        9
    Osk   2017-03-29 17:50:39 +08:00 via Android
    感觉像一不小心点了鼠标开始选字了。按 Enter 恢复。关掉快速编辑模式试试
    21grams
        10
    21grams   2017-03-29 17:56:41 +08:00
    肯定是鼠标点中了吧,我一直用 win10 从来没遇到这种问题。
    VYSE
        11
    VYSE   2017-03-29 17:56:52 +08:00
    你需要 ConEmu 甚至干脆 Bash on Ubuntu on Windows + ConEmu
    Quaintjade
        12
    Quaintjade   2017-03-29 18:00:44 +08:00
    哦对了, cmd 的功能会逐渐被 PowerShell 取代,所以估计巨硬根本就懒得修 cmd 。
    比如说 netsh 的 tcp/ip 就有如下提示:

    C:\>netsh
    netsh>int
    In future versions of Windows, Microsoft might remove the Netsh functionality
    for TCP/IP.

    Microsoft recommends that you transition to Windows PowerShell if you currently
    use netsh to configure and manage TCP/IP.

    Type Get-Command -Module NetTCPIP at the Windows PowerShell prompt to view
    a list of commands to manage TCP/IP.

    Visit http://go.microsoft.com/fwlink/?LinkId=217627 for additional information
    about PowerShell commands for TCP/IP.
    weiceshi
        13
    weiceshi   2017-03-29 20:19:27 +08:00   ♥ 1
    @Quaintjade

    如果你不熟悉一个命令的话,你可以查一下文档
    https://technet.microsoft.com/en-us/itpro/powershell/windows/vpn-client/add-vpnconnection

    Add-VpnConnection [-Name] <String> [-ServerAddress] <String> [-RememberCredential] [-SplitTunneling] [-Force]
    [-PassThru] [-ServerList <CimInstance[]>] [-DnsSuffix <String>] [-IdleDisconnectSeconds <UInt32>]
    [-PlugInApplicationID] <String> -CustomConfiguration <XmlDocument> [-CimSession <CimSession[]>]
    [-ThrottleLimit <Int32>] [-AsJob] [-WhatIf] [-Confirm] [<CommonParameters>]

    假如是 [-SplitTunneling]<Boolean>这种形式,那么才是你的用法。
    正确的用法是 如果带 -SplitTunneling 那么就是 true ,不带就是 false

    整个帖子都应该 move to [然而并没有]
    polun
        14
    polun   2017-03-29 20:27:56 +08:00
    貌似把"变速编辑“取消就行了。
    weiceshi
        15
    weiceshi   2017-03-29 20:33:48 +08:00
    @polun
    是的,关闭快速编辑后, cmd 里内容不再能被选中
    这个获取焦点后 pause 的功能,目的是有大量输出内容,快速滚屏的情况下,方便选中并复制内容
    还是那句话,整个帖子都该 move to [然而并没有]
    Quaintjade
        16
    Quaintjade   2017-03-29 20:45:03 +08:00 via Android
    @weiceshi
    你说的的确没错。

    然而这不是更傻缺吗?
    另一个 cmdlet Set-VpnConnection 也有-SplitTunneling ,用法却是 [-SplitTunneling] <Boolean>。明明完全相同的 parameter ,一个要带值,另一个本身就是个开关,明显是坑人。
    https://technet.microsoft.com/en-us/library/jj554823(v=wps.630).aspx

    退一步说,用法不同我也认了,但既然是开关,为什么带了值也不报错?这 TM 还是在坑人。
    gouchaoer
        17
    gouchaoer   2017-03-29 20:58:22 +08:00 via Android
    @weiceshi 我可是高级爬虫工程师,这种 bug 我搜遍百度都搞不定,然后你告诉我这是 feature ?
    weiceshi
        18
    weiceshi   2017-03-29 21:22:24 +08:00
    @gouchaoer
    https://www.google.com.hk/search?q=cmd+%E5%8D%A1%E4%BD%8F
    第一页第三条就是

    [Quote]
    cmd 窗口输出卡住的问题

    博客分类: 经验记录
    JSP
    访问一个 jsp ,该 jsp 中含有很多 System.out.println 的打印语句,某次操作突然发现控制台不输出了,有时输出有时不输出这种不确定性问题很难推断,曾一度怀疑是
    1. jetty 本身问题
    2. response.flushBuffer
    3. System.out.println
    4. System.out.println 过多
    最后一一排除,原来是鼠标点中了 cmd 窗口,导致它处于选定状态,即使最小化后又切回原系统, System.out.println 资源被占用,该语句又是单线程,所以程序流程就被卡在了这里,导致卡死状态,做一个试验,如果是在新的线程中去打印,然后选定控制台,看会不会卡住:
    [Quote end]
    gouchaoer
        19
    gouchaoer   2017-03-29 21:40:33 +08:00 via Android
    @weiceshi 我都说了搜遍百度搞不定的,我不用谷歌的因为谷歌太难了
    uuair
        20
    uuair   2017-03-29 21:47:09 +08:00
    vps 上要是用 windows 系统,如果用最低配的系统,最低的带宽, vnc 连上的时候会不会卡的要死啊?那还有体验么? windows 现在可以用 ssh 登陆了么?
    weiceshi
        21
    weiceshi   2017-03-29 21:49:29 +08:00   ♥ 2
    @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
        22
    KirkZheng   2017-03-29 21:49:32 +08:00 via Android
    我倒是认为 win10 有很大的改进,设计哲学深得我心,各种同步。
    Quaintjade
        23
    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
        24
    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
        25
    manhere   2017-03-29 22:16:03 +08:00 via Android
    一直用管道方式执行,未发现这个问题
    gouchaoer
        26
    gouchaoer   2017-03-29 22:20:51 +08:00 via Android
    @uuair 那种 adsl 拨号的 vps 就是,基本 xp 和 win7 系统,不会卡
    weiceshi
        27
    weiceshi   2017-03-29 22:26:56 +08:00 via Android
    @Quaintjade
    不要打滚了,错就错了好不好。
    微软给小白用户准备了 powershell ise , cortana 里直接搜就有,打开后右边窗口搜索命令,然后可视化编辑参数,勾勾点点然后点执行就好,绝不出错。
    ragnaroks
        28
    ragnaroks   2017-03-29 22:33:18 +08:00
    我在 ise 里面确实没遇到过问题,主要是 cmd-let 太多了,记不住,猜也经常猜错
    @weiceshi #27
    jsq2627
        29
    jsq2627   2017-03-29 22:33:43 +08:00   ♥ 1
    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
        30
    Quaintjade   2017-03-29 22:43:33 +08:00
    @weiceshi
    powershell ise 直接新建一个.ps1 文件,然后右键 edit 就有。我一般直接编辑命令 /参数,用 tab 自动完成。

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

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

    “程序是洋人发明的”,既然英语那么好那你一定喜欢混 hacker news、reddit programming 咯,干嘛上 v2ec 中文社区丫
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   761 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 22:47 · PVG 06:47 · LAX 14:47 · JFK 17:47
    ♥ Do have faith in what you're doing.