來源 https://www.itsvse.com/thread-3650-1-1.htmlphp
參考 http://www.cnblogs.com/piapia/html
https://www.pstips.net/powershell-online-tutorialsjava
http://www.cnblogs.com/volcanol/tag/PowerShell/python
問:如何開啓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"
pausemysql
----------第一章 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,本身編寫這部分。
五、實例一:開啓和關閉服務
六、實例二:控制防火牆(打開關閉,規則)
七、實例三:設置策略(密碼策略爲例)
---------- 第九章 這些額外的選學課 你感興趣嗎?--------------
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沒有此問題,放在命令行,放在腳本中,沒啥影響。linux