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 #值152for ($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 enabledelayedexpansionecho 正在查找默认网关...for /f "usebackq delims=" %%i in (`ipconfig /all`) do (echo %%i|find /i "gateway">nul||echo %%i|find "默认网关">nulif "!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/AppImageKitMAC 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).aspxad用户组管理,dhcp,dns,打印机,文件共享,iis,磁盘,网卡,exchange2016https://technet.microsoft.com/zh-cn/library/bb124413.aspxActive Directory 12 反垃圾邮件和反恶意软件 59 客户端访问 100扩展代理 4电子邮件地址和通讯簿 37联合身份验证和混合配置 高可用性 邮件流 邮箱 邮箱数据库 邮箱服务器 移动和迁移 组织 权限 策略和合规性 安全性 服务器运行状况、监视和性能 共享和协作 统一消息 用户和组 sqlserver2016 https://msdn.microsoft.com/zh-cn/library/hh245198.aspxlync2015https://technet.microsoft.com/zh-CN/library/gg398867.aspxSharePoint2016https://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-memberget-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 1234start-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 用 + 你的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 ISESteroidsise中运行: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.htmlpowershell字符界面的,powershell加WPF界面的,2048游戏http://www.cnblogs.com/piapia/p/5531945.htmlpowershell中的两只爬虫http://www.cnblogs.com/piapia/p/5367556.htmlPowerShell脚本:随机密码生成器http://www.cnblogs.com/piapia/p/5184114.htmlpowershell 递归 算法 的例子http://www.cnblogs.com/piapia/archive/2013/01/29/2881011.html【PowerShell语音计算器】http://www.cnblogs.com/piapia/archive/2012/10/20/2731506.html1 列出所有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,jsonsql表,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 | 过滤器3filter 过滤器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权限执行的,命令xxx" sshpass -p user_password ssh 问:两台带有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-15rxvt-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没有此问题,放在命令行,放在脚本中,没啥影响。