使用PowerShell消除Windows系统中WiFi网络名字后面的数字

我之前用过的手机热点的SSID是“Azure’s iPhone”,换了新手机之后再次打开热点,发现网络名字被Windows显示成了“Azure’s iPhone 2”,which 让我不太高兴。

解决方案:以管理员权限运行PowerShell,输入

然后输入

注意-like选项使用的是通配符,因此会匹配到iPhone而不是iPhone 2。结果看起来如下,只有一条:

确认无误后,加上Remove-Item进行删除操作:

然后把iPhone 2改回来:

-match选项使用的是正则表达式。关闭WLAN再打开,重新联网,问题解决。


由于管道中的Get-ItemProperty得到的是该注册表项下的值,而不是代表该项本身了,所以使用-PipelineVariable通用选项可以把管道前面的结果(这里是Get-ChildItem(ls)得到的项对象)存放在变量中以便后续操作,这要求PowerShell v4+。版本太低的话只好这么写了……看上去就很不pipeline了

 

在Windows上的Visual Studio Code中配置C/C++运行环境

虽然在Windows上写C++程序首推Visual Studio,但是如果想要方便地运行代码片段或者编译单个文件的话,Visual Studio Code仍然是一个好选择。

首先去扩展商店中搜索并安装“C/C++”以及“Code Runner”。安装好了之后点击重新加载,以使插件生效。

Code Runner只是一个快捷运行代码的工具,我们需要准备一个编译器。如果已经安装有Visual Studio的C/C++桌面开发相关组件的话,MSVC应该是可以直接用的(只想安装VS 2017单独的C/C++工具链的话,也需要从官网下载VS的安装程序,然后只勾选必要项即可)。mingw或者WSL中的g++、Clang之类的也可以,看个人喜好。接下来以MSVC为例,配置Code Runner的命令行参数。

点击文件-首选项-设置,找到扩展标签下的Run Code configuration,修改Executor Map项(需要手动编辑JSON文件)。

fig1

settings.json分为左右两个窗格。左边是默认设置,右边是用户/工作区设置。我们在右边新增同名的键,以覆盖左边的默认值。

以命令行方式使用MSVC(cl.exe)需要配置环境变量。最简单的方式是运行VS的开发人员命令提示符脚本,它的位置可以在开始菜单里找到。

可以直接按照上面的样子配置。VsDevCmd.bat会设置相关环境变量等,然后直接cd到当前文件所在目录,调用cl即可。

配置好了之后,保存settings.json,打开一个C/C++源文件,按下F1打开命令窗口,输入Run,找到Run Code命令,运行之:

fig2

编译运行后应该能看到如下界面:

fig3

看起来一切顺利,但是还有问题:MSVC输出的中文会变成乱码。随便拿掉一个语句分号再编译,就会发现这一点。原因在于Code Runner使用管道重定向了命令输出,然后将其作为UTF-8文本显示。这在Linux下似乎没有大问题,然而由于历史原因,多数Windows下的命令行工具使用的是本机编码(GBK)。如果Locale配置无误的话,常用字符的显示在Windows终端下倒是没问题。但是我们这种情况就比较麻烦了,因为如果直接运行cl这类程序的话,它们的MBCS字符输出会被系统的ANSI系API正确处理,然后打到屏幕上;但是这里Code Runner面临的是未经处理的字节流,而它……看什么都觉得是UTF-8。虽然我们也可以通过调整code-runner.runInTerminal设置,让命令直接在终端里运行,但是比较彻底的方式是让cl直接输出UTF-8文本,或者……帮它输出。

写一个Wrapper对于熟悉Win32编程的读者来说应该不难:

稍微需要注意的是,由于GBK编码是变长的,所以当收到的第一个字节的最高位为1时,要等待第二个字节到来,再进行转换;由于我们的程序是要被Code Runner重定向STDOUT到匿名管道的,所以我们自己写控制台时就不能使用WriteConsole了,而应该使用通用的WriteFile。

编译好了之后,将这个程序命名为GBKWrapper.exe,然后丢到随便一个%PATH%内的目录即可。

要利用这个程序,只需要修改一下编译命令行:

在cl前面加上GBKWrapper,就可以看到中文的编译器输出了:

fig4

细心的读者可能看到了cl编译器选项的/utf-8。由于VSCode默认的UTF-8是不带BOM的,因此会被cl识别为当前本机编码(GBK)的文件。设置/source-charset:utf-8即可解决这个问题。/utf-8会同时设定source charset和execution charset,所以普通的字符(串)字面值也会变成UTF-8(当然,可以用前缀控制字面值编码,比如u8、u和U)。