免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1220 | 回复: 2

[学习共享] ps第16课:【撸串.ps1】开始学习powershell的tab补全 [复制链接]

论坛徽章:
0
发表于 2019-04-27 12:29 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2019-05-15 16:07 编辑

为什么说假如没有tab补全,powershell就没法活,而bash啥事没有?


问:如何给powershell脚本起名?xxx.ps1
问:powershell脚本名,如何tab补全?
答:
建议用2---3个字母打头,剩下用中文文件名。即【bf备份所有旧文件_并删除10天前的.ps1】
这样先打【bf】,然后再打tab即可补全脚本名。






问:自己编写的powershell脚本的参数名,如何tab补全?
问:powershell参数名,如何tab补全?
答:
打脚本名 -<打tab>即可补全(含中文参数)
再打tab即可补全第二个参数。

例子:
-------a.ps1开始-------
param
(
$君不见黄河之水天上来_飞流直下3333千尺
)
echo $君不见黄河之水天上来_飞流直下3333千尺
-------a.ps1结束-------

运行:
./a.ps1 -<打tab>
即可出现:
./a.ps1 -君不见黄河之水天上来_飞流直下3333千尺






问:为什么说用powershell编写带参的脚本,比bash简单10倍,功能强10倍?
答:
1 不需要丑陋的gentopts,gentopt。
2 自动支持所有公共参数。不用编写脚本。
3 支持无限参数别名。
4 支持参数只验证。不用编写脚本。
5 支持try等。




问:powershell方法名,如何tab补全?
答:
目的:把字符a通过toupper()方法,变成大写。

'a'.toup<tab>
返回:
'a'.ToUpper(









问:powershell属性名,如何tab补全?
答:
例子
1 运行qq。
2 输入(get-process qq).w
3 打tab
返回
(get-process qq).WorkingSet






问:如何评价powershell的tab补全?
问:powershell的tab补全,你有啥结论?
答:
通过上面的学习我们看到,powershell可以补全:
1 powershell命令名,(含cmd命令,第三方命令)
2 系统文件名,
3 powershell参数名,
4 你自己编写的powershell脚本的参数名,100%可以补全。
5 powershell方法名,
6 powershell属性名,
这些内容中,完全可以含有中文。






问:如何评价bash的tab补全?
问:bash的tab补全,你有啥结论?
答:
bash可以补全:
1  外部命令名,(含第三方命令)
2  系统文件名,

3  99% 的【linux命令参数名】无tab补全!
或者说,大家都不装,都不用linux命令的参数补全。
理由如下:

3.1 虽然有写好的linux命令参数补全包,但不是默认安装。这导致了:
只有1%的人安装使用了参数名补全。剩下99%的人不用参数名补全,他们用手输单个字母参数名。
单个字母参数名,没有全单词,没有驼峰命名,这又导致了参数名不好记。

3.2 “第三方的【linux命令参数名】无法tab补全!”

这导致了“第三方的【linux命令参数名】的tab补全,需要其他方法,额外安装”


4 99.99%【你自己编写的shell脚本参数名】无法tab补全!
【你自己编写的shell脚本参数名】,想要有参数补全,必须单独编写补全脚本。
并存放在bash插件目录,这导致了“99.99%【你自己编写的shell脚本参数名】无法tab补全”
powershell不需要单独编写补全脚本。所以“你自己编写的powershell脚本的参数名,100%可以补全。”而且非常简单。






问:bash的tab补全,和powershell的tab补全,有何不同?
答:
1 bash没有属性和方法,所以上数第5,6条差异,大家应该没有异议。

2 当命令名,参数名,属性名,方法名中,有中文的时候,
powershell中文补全好,bash中文补全差,或者无法补全。这一点大家有异议么?





问:安装【命令参数名tab补全】后的bash更慢?还是powershell补全更慢?
答:
我不知道。我只知道powershell这边默认带有所有补全。bash这边默认不带。



问:如何看待【bash的tab补全差】,将影响整个linux?
答:
我脚臭将影响全家,影响老婆、孩子、火车车厢么?会影响的,对吧?
【bash的tab补全差】,影响所有linux程序的,含go开发的命令行程序;含py程序;含perl程序。
可以说,【bash的tab补全差】影响【除了linux版powershell】的所有程序。






bash这边,最终结论:
假如说tab补全是灯。那么bash这边一边漆黑。powershell这边一片光明。
一副好牌让bash打烂了。
bash人几乎不用【参数名tab补全】,他们用【手动输入单个字母参数名】,如 ps -e -f


问:powershell区分大小写么?
答:
powershell命令名,powershell参数名,(你在命令行输入时)不区分大小写。但是你输入的参数值,是区分大小写的。
win,linux,中的文件名写入=保留大小写。
win文件名读取=不区分大小写。
linux文件名读取=区分大小写。



问:powershell命令为啥那么长?我很不爽啊。
问:powershell命令会重名吗?
答:
powershell命令太多,超过好几万。微软为了powershell命令不重名,所以把powershell命令搞的很长。
正因为命令长,命令唯一,才让ps基本不需要像python那样,在脚本中import这个库、那个包。
鱼与熊掌而已。唯一的长命令名,不需要学习记忆包名。
但如果使用了第三方模块,还有可能重名。
如:
carbon模块中,有get-schcduletask命令。
内置的ScheduledTasks模块中,也有此命令,
这就尴尬了,命令重名了,你喊声悟空,六耳猕猴跑过来了。你喊声疯子,特朗普跑出来了
不过,人家教我一招:
Microsoft.PowerShell.Management\Get-ChildItem
(这个命令就是dir,在重名的时候才需要这样输入)
即先敲入【模块名】,再敲入【\】,然后再敲【命令名】,当然可以用tab补全。
这招太好了,相当于详细门牌号,两个命令名完全一样(命令冲突)也不怕了。不过命令名就更长了。
install-module  -AllowClobber 就是(安装模块时)允许重复的命令名的意思。




powershell这边,最终结论:
powershell命令名更长,powershell参数名更长,更容易理解。
powershell补全比bash好。但由于powershell命令更长,参数更长,所以powershell更依赖tab补全。






论坛徽章:
0
发表于 2019-05-15 16:08 |显示全部楼层
------【第二章 从【撸串.ps1】开始学习编写【powershell的参数补全】】------


问:powershell的参数补全分哪几种?
答:
分参数【名】补全,和参数【值】补全。
比如:
撸串.ps1 -吃几串 10
-吃几串 是【参数名】
10 是参数值



问:powershell的【参数名】补全,是否需要写脚本?
答:
不需要。
例子:
-------a.ps1开始-------
param
(
$君不见黄河之水天上来_飞流直下3333千尺
)
echo $君不见黄河之水天上来_飞流直下3333千尺
-------a.ps1结束-------

运行:
./a.ps1 -<打tab>
即可出现:
./a.ps1 -君不见黄河之水天上来_飞流直下3333千尺




问:powershell的【参数值】补全,是否需要写脚本?
答:
参数值是用户输入的,基本上是无法补全的,能补全的只有两种特例。
1 补全所有枚举。比如参数名是【-今天是周几】,那么只有7种选择。
2 补全部分常用的枚举。比如参数名是【-吃几串】,而输入值是一个数字,
那么常用的输入值只有:1,10,12。剩下不常用的2----21亿。不需要补全,让用户自己输入。




问:powershell的【参数值】补全,如何补全【所有枚举】?
答:
-------星期.ps1开始-------
param
(
[ValidateSet('周1','周2','周3','周4','周5','周6','周日')]$今天是周几
)
echo $今天是周几
-------星期.ps1结束-------

使用:
星期.ps1 -<tab>或shift<tab> 补全




问:powershell的【参数值】补全,如何补全【部分常用的枚举】?
答:
可以一次吃1串,10串,12串。也可以不用补全,手动输入99999串。

-------撸串.ps1开始-------
param
(
[ArgumentCompleter({1,10,12})]$一次吃几串
)
echo $一次吃几串
-------撸串.ps1结束-------

使用:
撸串.ps1 -<tab>或shift<tab> 补全




问:如何给没有【参数值补全】的ps命令,添加补全?
答:
假设我们想要补全【特定的邮箱账户列表】。或【计算机名列表】。

例子目的:给ps命令【Invoke-Command】的参数值【ComputerName】添加补全。
Register-ArgumentCompleter -CommandName Invoke-Command -ParameterName ComputerName -ScriptBlock {
    Get-ADComputer -Filter * | Select-Object -ExpandProperty Name | ForEach-Object {
        $Text = $_
        if ($Text -match '\s') { $Text = $Text -replace '^|$','"' }

        [System.Management.Automation.CompletionResult]::new(
            $Text,
            $_,
            'ParameterValue',
            "$_"
        )
    }
}



问:为什么win+powershell5.1,和linux+powershell6.2补全结果不同?
答:
linux人更喜欢按tab出列表,这兼容了bash的习惯。这和win上的习惯并不同。
设定方法如下:
1 升级psreadline版本,确保最新。
2 pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content  -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '


论坛徽章:
0
发表于 2019-05-15 16:10 |显示全部楼层
------【第二章 从【撸串.ps1】开始学习编写【powershell的参数补全】】------


问:powershell的参数补全分哪几种?
答:
分参数【名】补全,和参数【值】补全。
比如:
撸串.ps1 -吃几串 10
-吃几串 是【参数名】
10 是参数值



问:powershell的【参数名】补全,是否需要写脚本?
答:
不需要。
例子:
-------a.ps1开始-------
param
(
$君不见黄河之水天上来_飞流直下3333千尺
)
echo $君不见黄河之水天上来_飞流直下3333千尺
-------a.ps1结束-------

运行:
./a.ps1 -<打tab>
即可出现:
./a.ps1 -君不见黄河之水天上来_飞流直下3333千尺




问:powershell的【参数值】补全,是否需要写脚本?
答:
参数值是用户输入的,基本上是无法补全的,能补全的只有两种特例。
1 补全所有枚举。比如参数名是【-今天是周几】,那么只有7种选择。
2 补全部分常用的枚举。比如参数名是【-吃几串】,而输入值是一个数字,
那么常用的输入值只有:1,10,12。剩下不常用的2----21亿。不需要补全,让用户自己输入。




问:powershell的【参数值】补全,如何补全【所有枚举】?
答:
-------星期.ps1开始-------
param
(
[ValidateSet('周1','周2','周3','周4','周5','周6','周日')]$今天是周几
)
echo $今天是周几
-------星期.ps1结束-------

使用:
星期.ps1 -<tab>或shift<tab> 补全




问:powershell的【参数值】补全,如何补全【部分常用的枚举】?
答:
可以一次吃1串,10串,12串。也可以不用补全,手动输入99999串。

-------撸串.ps1开始-------
param
(
[ArgumentCompleter({1,10,12})]$一次吃几串
)
echo $一次吃几串
-------撸串.ps1结束-------

使用:
撸串.ps1 -<tab>或shift<tab> 补全




问:如何给没有【参数值补全】的ps命令,添加补全?
答:
假设我们想要补全【特定的邮箱账户列表】。或【计算机名列表】。

例子目的:给ps命令【Invoke-Command】的参数值【ComputerName】添加补全。
Register-ArgumentCompleter -CommandName Invoke-Command -ParameterName ComputerName -ScriptBlock {
    Get-ADComputer -Filter * | Select-Object -ExpandProperty Name | ForEach-Object {
        $Text = $_
        if ($Text -match '\s') { $Text = $Text -replace '^|$','"' }

        [System.Management.Automation.CompletionResult]::new(
            $Text,
            $_,
            'ParameterValue',
            "$_"
        )
    }
}



问:为什么win+powershell5.1,和linux+powershell6.2补全结果不同?
答:
linux人更喜欢按tab出列表,这兼容了bash的习惯。这和win上的习惯并不同。
设定方法如下:
1 升级psreadline版本,确保最新。
2 pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content  -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '


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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP