powershell入门教程-v0.3版

powershell入门教程-v0.3版

来源 https://www.itsvse.com/thread-3650-1-1.html

参考 http://www.cnblogs.com/piapia/

https://www.pstips.net/powershell-online-tutorials

http://www.cnblogs.com/volcanol/tag/PowerShell/

问:如何开启powershell脚本运行权限?
答:
echo 下面代码,在管理员权限cmd中运行,在管理员权限powershell中运行均可。
echo 如果使用powershell remoting远程。本机,远程机,都要用管理员权限运行一遍。
"C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
"C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
& "C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
& "C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
pause

----------第一章 windows脚本历史--------------

1 第一代脚本bat。从win95,win98开始---------到2008年左右结束。 特色:面向字符的命令,有命令行,管道。
2 第二代脚本vbs。特色:只有函数,传值,调用。
3 第三代脚本powershell。 从2012年开始,命令全面进化到面向对象。如tasklist和get-process 就是重复造轮 特色:面向对象。继承了前两代脚本的优点。

问:为什么要学powershell?
答:
传教士答,学一年powershell顶学5年bat。 语法简单,库功能强!
世界上唯一的,管道两旁的命令支持对象。即 面向对象的命令1 | 面向对象的命令2

windows和linux不同:
在win上的powershell脚本中,
支持cr,lf,crlf回车。支持多线程,多进程并发。
嵌入【文本2声音】很容易,“报告队长,磁盘已满”。
嵌入图形界面很容易。(当,弹出界面,要求输入用户名,密码,单选,多选等。)这些是linux脚本眼馋嫉妒的。

powershell和python不同:
powershell中使用中文很容易。中文脚本名,变量名,注释。中文单引号,中文双引号。
自动识别gbk,utf8,unicode编码。管道支持对象,这些是python脚本眼馋嫉妒的。

语法简单例子1:powershell单双引号之妙。
单引号,可以用双引号引用。反之亦然。
单双引号可以用@''@引用。
bat不行。

传教士旁白:
教程的设计,我是花了心思的。你们没看历史部分我写的很【简单粗糙】么?历史是一笔带过的。
但既然说了,就不是废话,就是想让学生菜鸟明确,从win7-win2008以后,脚本的【面向对象化】,才开始流行。引出下一章的面向对象详解。
任何ps入门教程,都应该提到面向字符和面向对象的区别。把这个话题揉到命令行历史去讲,简直再适合不过了。

----------第二章 面向对象之妙--------------
什么是对象,为什么要面向对象,微软为什么要重复造轮?

面向对象例子1:
问题:每天我吃2.2个苹果,17天我吃多少个苹果?
答:
可以用 2.2 x 17。也可以用任何脚本语言都支持的i++。
for ($i = 1;$i -lt 18;$i++)
{
        $苹果 = 2.2 + $苹果
        write-host $i,$苹果
}

--------------------------------------------
问题一变,我不告诉你天数,只告诉你,
每天我吃2.2个苹果,从2017年1月20日到6月20日,我吃多少个苹果?
$天数 = ((get-date '2017-06-20') - (get-date '2017-01-20')).days     #值151

每天我吃2.2个苹果,从2020年1月20日到6月20日,我吃多少个苹果? 
$天数 = ((get-date '2020-06-20') - (get-date '2020-01-20')).days     #值152

for ($i=(get-date '2020-01-20');$i -lt (get-date '2020-06-20');$i=$i.adddays(1))
{
        $苹果 = 2.2 + $苹果
        write-host $i,$苹果
}

结论:有了日期对象,计算天数,小时等,很简单了。【for ,,i++】很常见,但我从没想过,数字i能是日期型的。

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

面向对象的优点是什么?
在没有面向对象前,我们只有字符串和整数。
1 有了对象。
-----【字符型】-----
字符型的有system.string        这是最基本的,
System.Text.StringBuilder        内存中的,经常改变的,大字符串

-----【数值型】-----
system.int32,system.int64,system.decimal,system.double,System.Numerics.BigInteger无限大整数。
常用的是int32,decimal。

1/3*3 等于1还是0.9999 就是靠数据类型控制。
-----【数组】-----
system.array                        数组
system.arraylist        数组经常变化,如总在改写,追加,删除,就要用这个。速度比较快。
System.Collections.Generic.HashSet        去重数组。和python的set对象一样。

-----【表格】-----
1命令输出。如dir,get-process。
2写脚本时,我们用对象,属性构造。

-----【其他】-----
哈希表,文件等。

2 有了属性。 属性就是参数,比字符串粒度更小。在没有属性之前,我们就要用【烧脑正则】过滤,筛选字符串,简称【扣字符串】。有了属性就不用了。
3 有了方法。 方法就是程序,就是代码。无需自己重复编写。bat肯定是不行,没有方法,有也是个人写的,不可靠,不敢用。
方法可以是自己编写的ps函数,自己编写的ps类中的方法。
自己编写的方法,可以临时【并入】到第三方类中。
自己编写的方法,可以临时【并入】到.net类中。

面向对象的缺点是什么?
传教士在向用winxp的人传授powershell时。那人说,powershell不好,对象太占内存,他说的是对的。
cmd中我用dir返回100个文件名(字符串)。powershell中我用dir返回100个文件对象,powershell占用的内存多。
但今时不同往日:
1不必要的内容不要存在变量中。或者用完立马销毁,减少内存占用。
2内存大大滴够用了。因为cpu性能已经上不去了,我们正在疯狂加大内存,企图以空间换时间。
3我们更想要强大的功能,这年头面向对象是最基本的。py,php,java,.net,c++哪个不是面向对象的?

总结:
1对象比字符串粒度更大,更占内存。
2面向对象多了方法,功能更强。
3属性比字符串粒度更小,用起来极其方便。避免了【狂用烧脑正则去过滤】字符串!

===狂用烧脑正则去过滤例子,bat版的ping默认网关===
@echo off&setlocal enabledelayedexpansion
echo 正在查找默认网关...

for /f "usebackq delims=" %%i in (`ipconfig /all`) do (
echo %%i|find /i "gateway">nul||echo %%i|find "默认网关">nul
if "!errorlevel!"=="0" (
for /f "tokens=2 delims=:" %%a in ("%%i") do for /f "delims= " %%m in ("%%a") do set ipgate=%%m
)
)

echo 默认网关是:!ipgate!
===========ping默认网关.ps1============
$默认网关 = (get-netroute -DestinationPrefix 0.0.0.0/0).NextHop
& ping.exe $默认网关

# Test-Connection $默认网关
=======================

问:即然面向对象这么好,那么这些对象都是从哪里来的?
答:从.net库中来。

---------- 第三章 .net 简介 --------------

问:.net 核心分为几个版本分支?
答:
目前是三个版本。
.net 2.0        最新版.net 3.51
.net 4.0                                最新版.net 4.70
.net core 1.x                最新版.net 1.2   苹果系统,linux系统,嵌入式系统。
.net core 2.x                最新版.net 2.0   苹果系统,linux系统,嵌入式系统。

问:.net 有几个功能分支?
答:
桌面分支                                在.net中。包含winform。用于开发桌面窗口。
声音库
asp.net                                在.net和.net core中。web服务器功能库。用于开B/S的web服务器。
f#                                                在.net和.net core中。包含数学库,三角函数库等。
powershell                在.net和.net core中。包含脚本文件等常用系统管理接口。
Linux
◦Ubuntu 14.04 \ 16.04
◦CentOS/RHEL 7及以上
◦open SUSE 42及以上
◦Arch Linux (archl inux 没有版本号)
◦LINUX docker 容器
◦Linux AppImage 容器(portable application single binary)  https://github.com/probonopd/AppImageKit

MAC OS X
◦OS X 10.11

问:.net程序(c#程序)如何连接mysql服务器?
答:
去mysql官网下载.net语言的连接器。
mysql-connector-net-6.9.9-noinstall.zip--->v4.5--->MySql.Data.dll
给.net增加 MySql.Data 类,增加了数据库接口。

结论:
winxp的机子先安装.net 3.51,win7和win2008的机子,先安装.net 4.62以上。

.net已经存在很多年了,比支持.net的软件比支持java的少不了多少。所有.net的分支,接口(数据库,微信等。)
那些dll,那些类库,powershell都可以调用。和c#编写的exe完全相同。

问:除了.net 分支接口,powershell自己的库(模块)都有什么呢?
答:
请看下一章

---------- 第四章 powershell常用的 内置库,外置库,第三方库 --------------

传教士帮白:
这章没法讲,只是罗列库和手册。把此章节收藏。走马观花地看了这些库,就知道powershell都能干啥了。

win2012手册地址:(最常用的ad模块)
https://technet.microsoft.com/zh-cn/library/dn249523(v=wps.630).aspx
ad用户组管理,dhcp,dns,打印机,文件共享,iis,磁盘,网卡,

exchange2016
https://technet.microsoft.com/zh-cn/library/bb124413.aspx
Active Directory 12         
反垃圾邮件和反恶意软件 59  
客户端访问 100
扩展代理 4
电子邮件地址和通讯簿 37
联合身份验证和混合配置  
高可用性  
邮件流  
邮箱  
邮箱数据库  
邮箱服务器  
移动和迁移  
组织  
权限  
策略和合规性  
安全性  
服务器运行状况、监视和性能  
共享和协作  
统一消息  
用户和组

sqlserver2016 
https://msdn.microsoft.com/zh-cn/library/hh245198.aspx

lync2015
https://technet.microsoft.com/zh-CN/library/gg398867.aspx

SharePoint2016
https://technet.microsoft.com/zh-cn/library/ff678226(v=office.16).aspx

亚马逊虚拟机aws,微软虚拟机Azure,hyper-v,vmware vSphere企业级的虚拟机。

客户机:
服务,进程,日志,注册表,文件目录,远程管理。定时任务。

网络:
ftp,邮件,ssh连接linux服务器的客户端插件。

文本:
xml,html,cvs,json,excel等。

文本2语音

图形界面。

微软脚本中心
https://gallery.technet.microsoft.com/scrip{过滤}tcenter/

powershell软件源官网---powershell官方库。
https://www.powershellgallery.com

其他牛x库,都在github。另外,传教士群中定期发表【藏脚阁】之【牛x法宝】,都是好用的powershell第三方库。

---------- 第五章 入门必学必会 帮助命令的使用--------------

问:如何知道powershell版本?
答:
$PSVersionTable

问:不知道模块,如何查找?
答:
get-module -ListAvailable

问:只知道命令的一部分,如何查找命令?
答:
get-command  *service*

问:知道命令,但不知道命令中都有啥参数,如何列出参数?
答:
get-help write-host -Parameter *
show-command write-host

问:知道参数,但不知道哪个命令有此参数,如何查找命令?
答:
get-command -ParameterName encoding

问:如何从命令行获取某命令帮助?
答:
get-help get-date

-Examples                命令例子
-online                        在线手册

问:不知道命令(不知道对象)的属性方法,如何查找?
答:
"abc"  | get-member
get-date | get-member

问:中文的.net类的手册在哪?
答:
msdn。最基本的字符串的属性和方法,的手册在。
https://msdn.microsoft.com/zh-cn/library/system.string.aspx

---------- 第六章 常用命令的介绍 --------------

第一个要学的命令就是dir
问:为什么要用powershell的dir【即Get-ChildItem】,而不用cmd的dir?
答:
面向对象,方法强,属性多。
$文件 = dir a:\pscode\temp183\aaa.txt
$文件.FullName   #返回全路径属性
$文件.BaseName   #返回文件名属性
$文件.Extension  #返回扩展名属性
$文件.LastWriteTime #返回最后写入时间属性

第一个要学的语法就是数组语法。$a = @(xxx命令)
问:有时候必须用【基于字符的外部命令】,如何把返回值,按行为单位,分成数组。
答:
$a = @(ipconfig)
$a[8]  #第9行

get-childitem用法:
powershell 3.0及以上版本增加的 参数

get-childitem d:\xxx  -file  #过滤,只输出文件
-Directory  过滤,只输出目录
-Hidden  过滤,只输出隐藏

问:打开一个文件,以行为分割,放入一个数组?
答:
$a = Get-Content a:\pscode\temp183\aaa.txt -ReadCount 0

问:打开一个文件,作为一个大字符串,存入整个一个变量?
答:
$a = Get-Content a:\pscode\temp183\aaa.txt -raw

$a,$b,$c = 1,2,3

问:如何后台运行命令?
答:
古有cmd /c "命令"
今有powershell /c  "命令"  ,或 powershell -c  "命令" ,
powershell -file  "脚本.ps1"  -参数1 aaaa  -参数2 1234
start-process -path xxx.exe -ArgumentList '-参数1 aaaa  -参数2 1234'

问:我想用另一个本地用户运行脚本,但powershell没有runas。exe 类似的命令咋办?
答:
powershell中有各种session呀。
ip+端口+用户名+密码=一个session,我只需更换用户名,更换密码,就可以更换权限。因为权限绑定在用户上。
同理,我只需要建立n个session使用,无需切换用户。
最主要的new-pssession,中有-Credential参数,输入用户密码,这不是跟runas。exe一样么?还有什么SmbSession。
所以我觉得powershell没有必要用runas。exe。
你只要用那些带session,带Credential的命令即可呀,对不?

查看参数名中,含【Credential】名的命令:
get-command -ParameterName Credential

查看命令中,含【session】字符的命令:
get-command *session*

问:如何用powershell发邮件?
答:
Send-MailMessage   -Subject "主题"       `
-From  "你的hotmail账户@hotmail.com"   -To  "你的qq邮箱@qq.com"   `
-SmtpServer   "smtp.live.com"  -Port 587  -UseSsl    -Credential  "你的hotmail账户@hotmail.com"  `
-Attachments $附件 -BodyAsHTML -body $HTML邮件内容

注意:
1 用xxx@QQ.com + 你的qq密码 + 上述命令 发邮件是不行的。因为为了qq密码安全,腾讯要求独立的邮箱密码。  
2 从qq邮箱发件,默认也不行。被关了,需要在设置中开启smtp。
3 powershell 3.0 和 以上 才支持port参数。对于win7,你需要先安装ps最新版

问:监控win cpu,磁盘,网络,io等。
答:
性能监视器或
Get-Counter 从本地和远程计算机上获取性能计数器数据。

问:如何查看有哪些计数器项目?
答:
都是手册上的东西。
查有哪些大类用:
Get-Counter -ListSet * | Sort-Object CounterSetName | Format-Table CounterSetName

比如我现在已经知道是磁盘大类是(PhysicalDisk)了,再查磁盘中有那些小类,用:
(Get-Counter -ListSet PhysicalDisk).Paths

问:如何查看日志?
答:
事件查看器,或
get-eventlog

问:如何执行字符串?
答:
$cmd1 = 'xxxx'
Invoke-Expression $cmd1

那么好,单个命令我们已经学会不少了,下面我们来看powershell脚本的执行。

---------- 第七章 ps1脚本编写,调试,运行 --------------
脚本是命令语句的组合和叠加。脚本就是胶水,四处去找别人调用,四处找*组装汽车。而不是做*,给别人用。

菜鸟问:如何写脚本?
老鸟答:
1 必须搞清楚问题细节。例如:做月饼。
2 解题思路也基本完成。面粉和水,放入馅,蒸。
3 使用什么命令,变量。加五仁,放入模子,挤压。
4 先粗写,写个大概。
5 调试通过。
6 详细写。考虑出错情况,加上错误代码,错误信息。去掉容易出错,不容易兼容的代码。改写性能不佳的代码。
到这一步为止,好的脚本可能不好看,但该的很好用了。
7 精雕细琢。重构,把重复使用的代码段,写成函数。重写变量名,使人能一眼看懂。格式化好代码,搞好缩进。

问:编写ps1用什么ide?
答:
最最推荐使用visual studio code,加上powershell插件。
特色:代码提示,自动完成,代码格式化,缩进选择空格还是tab,文件编码设置。
有插件名叫ftp-sync,可以在win的vscode中编写ps1脚本,保存时,自动同步到linux目录中。

问:调试ps1用什么工具?
答:
最推荐powergui   生平不用火车头,纵然英雄,ps脚本也蹦吧报错!
vscode也可以

问:代码格式化,用什么工具?
答:
该缩进的都缩进,等号都对齐。

powershell ise + ise 插件 【ISESteroids】

安装:
Install-Module -Name ISESteroids

ise中运行:
Start-Steroids

问:让代码颜色漂亮,用什么工具?
答:
1 用上面的工具把代码格式化好。
2 用powershellise + 传教士diy的配色2016版。
3 抓图。世界上最赏心悦目,颜色漂亮的powershell代码产生了。

上述ide全都是中文的。

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

问:如何开启powershell脚本运行权限?
答:
echo 下面代码,在管理员权限cmd中运行,在管理员权限powershell中运行均可。
echo 如果使用powershell remoting远程。本机,远程机,都要用管理员权限运行一遍。
"C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
"C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
& "C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
& "C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
pause

问:火车头(powergui)有什么缺点?
答:
无法设置背景颜色。

问:vscode有什么缺点?
答:
【$】和【变量名】不是一个颜色。
调试功能慢,有时死锁。

问:ise有什么缺点?
答:
无法选择编码保存,转换编码。
缩进为【空格】,【tab】两者都有。在其他文本编辑软件中,显示缩进错乱。

---------- 第八章 实战 演练 --------------
群友6504748,自己编写这部分。

5、实例一:开启和关闭服务
6、实例二:控制防火墙(打开关闭,规则)
7、实例三:设置策略(密码策略为例)

---------- 第九章 这些额外的选学课 你感兴趣吗?--------------
powershell脚本,命令行参数传值,并绑定变量的例子
http://www.cnblogs.com/piapia/p/5910255.html

让powershell同时只能运行一个脚本(进程互斥例子)
http://www.cnblogs.com/piapia/p/5647205.html

powershell字符界面的,powershell加WPF界面的,2048游戏
http://www.cnblogs.com/piapia/p/5531945.html

powershell中的两只爬虫
http://www.cnblogs.com/piapia/p/5367556.html

PowerShell脚本:随机密码生成器
http://www.cnblogs.com/piapia/p/5184114.html

powershell 递归 算法 的例子
http://www.cnblogs.com/piapia/archive/2013/01/29/2881011.html

【PowerShell语音计算器】
http://www.cnblogs.com/piapia/archive/2012/10/20/2731506.html

1 列出所有efs加密文件。2解密所有efs加密文件
http://www.cnblogs.com/piapia/p/4702514.html
是为系统管理员,网管员编写的工具。
某员工离职后,他的磁盘假设有一万个文件(目录),其中efs加密的文件目录有3个。资源管理器中,这三个文件是绿色的。
但你要是(一万个目录)挨个点开看,是不是绿色,要累死。
这时网管用员工的win账户,登录员工pc机,用此脚本,即可列出所有efs加密文件。

---------- 第十章 请提问--------------
各位卿家,有事启奏,无事退朝。

----------第十一章 linux篇--------------

传教士道:只要能装上powershell的linux版本,只需要ps1脚本,不需要sh脚本。
解释:
1 简单来讲,bash中只有语法,没有命令和库。
2 bash只有1%的语法功能,powershell实现不了。这很正常,世界上没有两片叶子是完全一样的。
这意味着你只需要ps1脚本,不需要sh。
3 bash太老了,同样的功能,powershell都能实现,还能省时间,如万个空for,powershell要节省90%的时间。
4 即学用/usr/bin/powershell 代替/usr/bin/bash。其他linux命令,管道,旧的功夫等,用法完全和在bash中一样。
5 逐渐用面向对象的,简单强大的,powershell命令和库,代替烧脑的linux命令,或者两者都用。---这是总的原则,总纲。

问:目前哪些版本linux能安装上powershell?
答:
◦Ubuntu 14.04 / 16.04
◦CentOS / RHEL 7及以上
◦open SUSE 42及以上
◦Arch Linux (archl inux 没有版本号)
◦LINUX docker 容器
◦Linux AppImage 容器(portable application single binary)  https://github.com/probonopd/AppImageKit

问:为什么说win的命令行比linux强?
答:
1 win中的命令已经进化成面向对象的powershell。linux还不行。从win7开始,到win2012r2为止,进化结束。

2 从前我听说unix,linux命令多,很强大。但现在我告诉你,powershell命令比linux命令,至少多十倍。反正我这辈子是学不全了。

3 linux的更依赖图形,命令太少。而win命令比linux多很多。
3.1 linux中任何一款,邮件服务器中的命令,比exchange多,比exchange全?比exchange方便?
3.2 linux的dns服务器bind,不如win的dns命令方便。bind有给某个域中,域名添加ipv4的a记录的【命令】吗?还不是依赖web图形?
有人说用nsupdate。那还不是搞个文本,再运行文本。和用sed替换【dns区域文件】,然后在reload【dns区】有何区别呢?

4 新版win中,或者说是powershell中,都是【撸命令+参数】。而linux大都还在【sed撸文本】。
4.1 以给网卡配ip为例。
nmcli connection add type ethernet con-name NEW_STATIC ifname eno1234567 ip4 192.168.1.111 gw4 192.168.1.1,
不比用sed撸ifcfg-eth0文件方便么?

5 任何语言都要处理数据,脚本也一样。powershell有了对象的帮助,处理起数据来,比awk更得心应手。神马csv,excel,xml,json
sql表,nosql表。html等。

问:powershell如何实现【sed -i "s/要查找的内容/替换成/g" 文件名】?
答:
@(Get-Content 文件名) -replace 'aaa','bbb' |Set-Content 文件名 $aaa
即打开文件,替换,保存文件。

问:为什么说linux中,用sed人越来越少了?
答:
论点1:awk可以代替sed,但sed不能代替awk。
sed即,简单查找替换。awk有for之类的可以实现复杂处理。

论点2:awk用的是标准正则,sed的正则和sed部分相同,部分不同。
学了sed就代表脑中两套不兼容的正则标准相互打架。

问:那么说学awk就对了?
答:
学powershell比学awk简单。
powershell用【split再split】,【if再if】,where-object,string.substing(),string[-3]等。
把字符串问题层层分解。比awk正则简单。

问:powershell中可以使用管道和awk吗?
答:
powershell中完全可以调用awk,和bash中完全相同。旧的武功,完全都灵。

问:用powershell的话,如何实现【awk '{print $3}'】功能?
答:
($行 -split "\s+|\t+")[0]  #第一行
($行 -split "\s+|\t+")[2]  #第三行

Get-Content /xxx/yyy.txt | foreach-object {$_.split()[2]}    #awk '{print $3}'

问:用powershell的话,如何实现【awk -f a.awk file】功能?
答:
本质上,这是一个使用了管道的过滤功能。在powershell中,这叫做【过滤器】或者叫【筛选器】。
而powershell支持命令+管道+过滤器的组合。如 命令1 | 过滤器1 | 命令2 | 过滤器2 | 过滤器3
filter 过滤器1 
{
类似awk的功能
}

问:powershell中有【xargs】吗?
答:
管道中使用的pipe变量名为:【$psitem】,它的别名为【$_】。
powershell用foreach-object和$_,来实现xargs的功能。

问:powershell中有【<】【<<】号吗?
答:
没有。
或许从右到左的【<】符号反人类思维。powershell很多命令都给他改成了从左到右的。
如get-random < (1..100)在powershell中不合法,合法的应该是get-random -inputobject (1..100),或1..100 |get-random
只有不到1%的奇葩命令【必须】依赖【<】符号,这时可以通过在powershell中调用cmd,或在powershell中调用bash(linux版powershell)来实现。
如$a = bash -x "命令1 < 命令2" #linux
如$a = cmd -c "命令1 < 命令2" #cmd

问:powershell中有expect命令吗?用powershell怎么从win连接到linux的ssh服务器?
答:
1有。对于某些奇葩,偏门的应答需求,有第三方模块。
2没有。powershell不使用expect命令,而使用连接(session)。

用powershell + ssh客户端库 + ip + 端口 + 用户名 + 密码,组合成一个连接,并向这个连接发命令。代码如下:
$连接1 = New-SSHSession -ComputerName 1.1.1.1 -Port 22 -Credential aaaa  #将提示输入密码
$要返回的内容 = Invoke-SSHCommand -Command {cat /etc/issue} -SSHSession $连接1

这种标准的功能,如(MongoDB,mysql,ssh,ftp,http,telnet,等),都有驱动或模块。ps和。net程序,通过驱动连接,发送命令,接受数据。
用模块或驱动收发【数据】的好处是:
数据将被转化成.net对象,进而转化成为ps对象。否则,全都是字符串,ps门派的【面向对象武功】全都废了。

以MongoDB为例,用模块或驱动【发命令】的好处是啥?谁谈谈?
我觉的好处是:
1多线程。后台线程跑,不占用当前线程。
2我们可以随时从session中【半路断开跑出来】,执行别的ps代码,函数,还可以【随时回session中去】。脚本写起来更灵活,调试方便。
3session带来了多个用户,不同的用户可以有不同的服务器权限。

问:powershell中有su,runas命令吗?怎么用powershell运行另外一个用户的命令?
答:
没有。
在powershell中,运行linux本地命令和管道毫无障碍。如:
ssh aaa@127.0.0.1 "以用户aaa权限执行的,命令xxx"  
sshpass -p user_password ssh aaa@192.168.1.1

问:两台带有sshd的linux机子?怎么用powershell连接并发送命令?
答:
除了上面的方法,还可以用新建linux session的方法。(从linux连到另一个sshd)
注意:此方法需要编辑/etc/ssh/sshd_config文件。加入下列行
Subsystem powershell powershell -sshs -NoLogo -NoProfile
后,重启sshd服务器。
详细手册在此:
https://github.com/PowerShell/PowerShell/tree/master/demos/SSHRemoting

命令:
$连接2 = New-PSSession -HostName 127.0.0.1 -UserName  user006 #手动输入密码或用-KeyFilePath 选项
Invoke-Command -Session $连接2 -scrip{过滤}tBlock {new-item ~/ccc.txt}

总结:
win客户机,连linux服务器。目前需要第三方模块,当然这是官方库中的模块,用install-module PoshSSH即可。
linux客户机,连linux服务器。需要编辑/etc/ssh/sshd_config文件。
linux客户机,连win服务器。需要在服务器上开启服务。在客户机上信任服务器。
win客户机,连win服务器。需要在服务器上开启服务。在客户机上信任服务器。

问:powershell中有【grep】吗??
答:
powershell中用select-string命令。
单从编码的角度,select-string=聪明,grep=傻 + 有硬伤  :mrgreen:
有bom头时,select-string 自动识别文件编码类型。
无bom头时,无需像linux+grep那样,改变shell环境,无需按某编码另存文件。只需要根据文件编码的不同,指定-encoding参数。 
而grep没这功能,即有【无法指定文件编码类型】的硬伤。
当然grep也不是一无是处,grep有些参数,有额外独特的功能,select-string没有,这就是grep比select-string强的地方。

问:powershell中有【eval】吗?
答:
powershell中用Invoke-Expression来执行字符串。

问:powershell中有【tail -f】吗?就是可以实时的把某个文件新产生的行输出。
答:
Get-Content D:\a.txt -Tail 10 -ReadCount 0 -Wait

问:我想用小键盘的同时,还想要256色终端,那么xshell应该如何设置?
答:
终端---》终端类型---》【putty-256color】或【export TERM=putty-256color】
终端---》键盘---》default或linux。

Eterm-256color可以
gnome-256color不行
konsole-256color不行
putty-256color可以
powershell 传教士 原创分享 2017-02-15
rxvt-256color不行
screen-256color不行
st-256color可以
vte-256color不行
xterm-256color不行
用SecureCRT道理一样

问:shell和python谁更强大?
答:
各有所长,可以互补。但是却无法互补。下面详述。

问:为什么说linux版的powershell,更适合于运维人员用来写脚本?(比linux版python)
答:
1 python有的面向对象功能,linux版powershell都有。

2 python没有命令行。
2.1 python无法成为ssh默认终端,linux版powershell可以。参见章节:《两台带有sshd的linux机子?怎么用powershell连接并发送命令?》
2.2 python中使用shell命令(awk,grep等),非常麻烦。需要增加很多py语法和代码。linux版powershell运行awk这些命令和bash一样。

3 python没有管道。让n个【命令行程序】之间传值,非常麻烦。需要增加很多py语法和代码。linux版powershell有管道,运行awk这些命令和bash一样。

4 python有版本2,版本3不兼容的癌症!问题。linux版powershell没有这样的问题。
4.1 这些问题包含编码问题。

结论:
shell命令如grep等,对编码支持本就不好,不如powershell在家上上述4.1的编码问题。再加上上述2,3点。
令linux人痛不欲生,顾很少有人在py中用外部命令。【py命令库】和【shell命令】死不往来,基本无法互补。而linux版ps就不同了。

问:为什么说powershell的转义,比shell要好?
答:
1 powershell是面向对象的,属性返回的是直接可用的数据。比面向字符脚本语言(bat,shell)需要扣字符串的情况要少很多。
天生遇到【需要转义的内容】就少。
2 字符串查找替换,powershell中有不需要转义的,.net类中的方法。如:
[string]$a = 'abc\\def'
$b = $a.replace('\\','当')
#返回:【abc当def】
判断ip是否合法,可以用IPAddress类中的TryParse()方法。 
总之我的建议是,尽量多用.net类方法,尽量少用正则,或者只用简单正则。
3 powershell内部用【`】作为转义符。【`】比【\】更不常用,作为转义符冲突少很多。
3.1 在编写数据库的脚本的时候,【`】的冲突就多了。
如【`table`】 会和【`t】冲突,如【`biao`】会和【`b】冲突,后来我用【`表`】解决的。
4 ps字符串查找替换,有正则引擎,兼容linux,也是用【\】作为转义符。
不过,有专门的字符串转义函数【[Regex]::Escape()】,先转义后进行查找替换,代码可读性高。
$转义前的原始字符串 = '\+\&*|]'
$转义后的字符串 = [Regex]::Escape($转义前的原始字符串)
-------------
脚本例子
[string]$a = 'abc\\def'
$转义前的原始字符串 = '\'
$转义后的字符串 = [Regex]::Escape($转义前的原始字符串) #【\】--->【\\】
$b = [Regex]::replace($a,$转义后的字符串,'当')
$b #返回【abc当当def】 
-------------
5 bash和awk,各自有for,各自有转义。组合起来,很容易甲影响乙,甲吞掉乙。
遇到【'】,【"】,【\】,【*】也很容易出问题。
这就像穿了两层秋裤,你拉动一层,另一层也跟着动,你需要费脑筋去关注他俩的兼容。
此乃癌症,很难解决。
但是捏,这问题也是可以在一定程度上避免。这需要写shell的人改正臭毛病。
【把awk代码单独放在.awk文件中,而不是放在命令行中】
powershell没有此问题,放在命令行,放在脚本中,没啥影响。

上一篇:Yii2.0-生成二维码实例


下一篇:StringUtils 字符串工具类