powershell入門教程-v0.3版

weixin_34075268發表於2018-07-14

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沒有此問題,放在命令列,放在指令碼中,沒啥影響。

 

相關文章