find-command管道符export-csv -PATH all_commands,俗話說,工欲善其事必先利其器,我們既然要經常與powershell的指令打交道,就要弄明白powershell究竟有多少個指令,這個指令擷取了powershell服務上所有的指令,注意,這裡面包含很多本地不存在的指令,以及指令所在的子產品,知道指令所在的子產品之後後面我們就友善安裝這個子產品并使用其中的指令了
ConvertFrom-Json $jsonStr 這個指令會将jsonString轉換為json對象,這是它非常強大的地方,在java中,我們需要對jsonString進行對象序列化,而在powershell我們隻需要使用一下這個指令就可以直接進行對象調用操作
find-module管道符export-csv -PATH all_modules,powershell 除了可以查找很多指令以外,還可以查找modules,find-module 擷取的内容來自于一個網站,叫做powershellgalley,我們加上com可以直接進入這個網站,可以看到這個總的包數在21萬個左右,相比maven和pypi确實不多,但是也夠用了
install-module -name Selenium -AllowPrerelease ,為powershell安裝selenium子產品,這個指令可以說非常友善易用,最為關鍵的是我們直接從powershell gallery上面複制安裝module的指令就可以了
get-command管道符where 大括号左.source -like 雙引号Selenium雙引号大括号右,這個指令将會擷取Selenium所有的函數,這樣我們就可以對selenium的函數有一個整體的了解了
反引号,也就是重音符,在powershell中是轉移字元的意思,比如在下面這張圖中,我使用反引号将雙引号進行了轉義,保證程式可以正常執行
$PSVersion 在這裡我要區分一下powershell的desktop版本 和 core版本,因為這非常重要,因為它倆是不同的。。。我剛剛安裝了selenium但是在desktop版本中無法使用。。windows自帶的叫做desktop版本,你安裝的powershell叫做core版本
Install-Module -Name Selenium,而且指令也不能直接拿過來用,在desktop版本中,我不能添加-AllowPrerelease參數,否則會報錯,這一點要注意。
import-module -name Selenium,為什麼要在desktop版本中安裝selenium,直接在core中使用不行嗎?不是的,因為PowershellISE不支援core版本,應該說core版本和desktop版本有很大的不同,一個顯著的特點是在windows上除了有自帶的powershell.exe以外你還可以安裝powershell core,且code版本的啟動檔案為pwsh.exe 這一點要明白
powershell.exe 與 pwsh.exe 之間的差別,再由就是,core删除了很多cmdlet,因為這些cmdlet在linux和macos上面不支援。。。
Install-Module -Name Selenium,現在我們再打開powershell ISE 就會發現在右側子產品中已經有了Selenium,選擇selnium 我們可以看到selenium支援的指令
start . ii . explorer(gl) 在powershell中,我們可以使用以上這三種方式打開目前檔案夾。就像cmd中的 start. 一樣,非常友善
ii 斜杠 可以打開目前根目錄
gal ii gal start get-command explorer 我們可以通過這三種方式檢視所執行指令的原始指令
$driver = start-sechrome ,回到powershell ISE ,輸入這行指令,先别執行,現在執行會提示找不到 chrome binary ,這是因為原來的chromedriver.exe 已經很老了,我們需要更新一下chromedriver.exe ,具體在那兒更新呢?
get-module -listAvailable ,我這裡要特别的講一下get-module ,不帶任何參數的get-module 隻能擷取目前控制台加載的module,要想擷取所有有效的module我們應該使用 get-module listAvailable 這個指令
确定了selenium 的版本,以及其所在的目錄,我們進入這個檔案夾中,找到chromedriver.exe 然後換上最新的版本的。
$driver = start-sechrome;enter-seurl xxx.com -Driver $driver ,我們回到Powershell ISE界面,然後點選上面的三角運作
程式會彈出一個視窗,并進入百度首頁,這樣就意味着程式執行成功了
關于這個selenium-powershell的具體資訊,我們可以參考github上的readme,裡面介紹的蠻詳細的
首先我們去nuget下載下傳selenium的c#dll檔案,但是注意,因為我之前已經安裝了powershell的selnium,是以并沒有真正的下載下傳,因為powershell其實就是對c# selenium dll的封裝,是以我們可以直接使用,第一個要做的就是将dll加入環境變量,然後New出 chromedriver的對象,下面的使用方式基本都和寫c#的差別不大了
select-object,get-command管道符select-object name,version,source source,name,version 在powershell中你可以選擇要顯示的對象,準确的來說就是我們用紅線圈起來的部分
where-object,select-object 我們來看一看這兩者的差別,顯然,select-object 隻能選擇列,和where-object則可以對其中的内容進行篩選,這兩者的差別就在于一個對行進行操作,篩選,一個隻能選擇列
object 在powershell用的很廣泛。因為powershell一切都是面向對象的,是以我們有必要了解一下對象是個什麼東西,如果搞過java的人對這個應該有很深的感受,其實這張圖檔也講的差不多了。我這裡舉例 人是一個類,張三是人的執行個體對象,張三的頭發是黑色的,皮膚是黃的,這裡的頭發和皮膚就是屬性 properties,張三會張嘴,吃飯,這裡的張嘴吃飯就是方法。
get-command管道符where-object 大括号左$_.Name -like 雙引号通配符object通配符雙引号大括号右,get-command管道符findstr i 雙引号object雙引号,怎麼說呢,我個人比較喜歡findstr的形式,但我們這裡不講這個,主要來看看object的操作方式。分别有Compare ForEach Get-WmiObject Group Measure New Register
powerhsell的變量标注定義很像python的類型标注,當然我們可以不用加任何類型的,可以直接$var 定義内容
$pid 這裡是目前打開的powershell視窗的pid ,process ID号
$error powershell中的$error 自動變量代表的是你所有的錯誤的曆史記錄,在下圖中可以看到powershell允許我們使用數組index來索引第幾個第幾個錯誤,index在0的永遠是最新發生的錯誤的記錄,$error 最多可以儲存大概256條資訊
dir env:在powershell中,環境變量就像證書以及盤符一樣是可以進行周遊查詢的,是以我們可以通過 dir env:的方式來檢視系統所有的環境變量
$env:dir $env:tmp $env:path $env:java_home 等等,在powershell中,我們可以直接通過env:應用環境變量的變量名來擷取其值
$input 首先這個自動變量隻在powershell函數中可用,再來我們看一下它的具體作用,我們可以看到,elements後面數出來所有的參數内容,這意味着$input 在函數中表示所有的參數,包括我們看到将$input 初始化,這曆的@符号是初始化的意思,之後指派給$pipelineData ,我們擷取了$input的所有内容,包括這些參數的總個數
$num=@(1,2,3) 在powershell中@代表初始化數組的意思
$true $false powershell的布爾值也必須使用$符号進行标注,這是我沒有想到的,因為我們在編寫powershell腳本時要特别注意這一點
$host 裡面存儲了powershell控制台的一些資訊,在ISE 和 powershell視窗中運作的結果是不一樣的,我們可以看到
$? 這個變量用于訓示上一個指令是否執行成功,在下面這張圖裡你可以看到$? 上面的指令執行出錯了,後面就是false了
$profile 裡面都是powershell的配置檔案,這些配置檔案将會在powershell啟動的時候運作,我這裡是一個名為powershell_profile.ps1 每次在打開powershell時都會運作這個檔案,檔案的内容含義是每次打開都會指定console的編碼為utf-8
gwmi -class win32_operatingsystem 擷取作業系統的相關資訊 系統目錄 版本資訊 版本号 注冊使用者 序列号 版本 ,這裡的gwmi 就是 get-wmiobject
gwmi -class win32_operatingsystem管道符select 通配符,将擷取所有的作業系統資訊
($organization = gwmi -class win32_operatingsystem管道符select 通配符管道符select Organization).Organization ,進一步選擇,我們将擷取更為精确的内容
powershell 聲明數組的方式,建議強制指定類型,這裡看不出來什麼差別,但在實際使用的過程中,如果一開始将$var 定義為字元串,那麼後面的定義如果沒有指定字元串,@(1,2,3,4)有可能也是字元串
powerhsell的數組支援簡單的切片操作
$hashtable = @大括号左key1=雙引号a雙引号;key2=雙引号b雙引号大括号右,hash表這個東西在powerhsell中初始化的方式如下圖所示,調用方式也有展示
$hashtable.Add(“key3”,“ccc”)在hash表中添加key 和 value的方式,與初始化時有一定差別,必須要添加雙引号,如果不加的話,可能會被視為一個語句
$hashtable管道符select 通配符,要擷取hash表的詳細資訊可以使用select指令
$modules=import-csv all_modules.csv 我們除了可以導出csv以外,還可以導入csv檔案,并且直接調用對應的對象
$modules.name 可以擷取name列的所有的内容
$modules管道符foreach大括号左$_.name大括号右 ,而在powershell2.0時你必須使用foreach這種方式才能夠進行周遊
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0 ,這個指令可以直接為電腦開啟遠端桌面,而無需打開GUI界面去設定,我這邊已經嘗試過,在win10系統确實可以用
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 1 , 同理,将值設定為1就是禁用的意思
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH✲' ,接下來談一談powershell中openssh的安裝,首先擷取openssh功能子產品的資訊,可以看到我這裡是已經安裝的狀态
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 , 添加openssh 伺服器子產品開始安裝,伺服器子產品的安裝時間比較慢些
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0,Client端也是同樣的安裝步驟,chient安裝的比較快些,注意。伺服器端和用戶端,在兩台電腦上都要安裝
ssh 伺服器位址,然後回車,第一次會提示你信任什麼的,你輸入yes,回車然後會要求你輸入密碼,這裡輸入密碼的過程是看不到的,光标也不會移動,回車後就會發現已經連上了,進入桌面,輸入dir 回車成功執行指令
start-service sshd , 還有一個過程不要忘記,就是啟動伺服器端啟動 sshd服務,這樣才能執行上面的連接配接操作
(dir d:\).fullname ,将列出d盤檔案夾下的所有目錄,并擷取全路徑名
(dir c:\).name ,使用name 則擷取短路徑名
get-help dir -full,name 指令名稱,syntax 文法,parameters 參數,description 指令詳細說明,inputs 輸入類型,outputs 輸出類型,notes 指令的别名資訊,related links 相關連結。這個顯示了指令的詳細資訊
help dir -full,powershell 支援 help 函數來查詢指令的幫助,與get-help不同的是,help函數不會一次将所有的幫助資訊顯示出來,而是顯示完目前頁面之後,後面的内容需要你按enter鍵繼續浏覽
get-help ✲help✲ ,模糊查詢,用于擷取一些包含指定參數的指令
[參數辨別名 參數值] ,在 powershell中,凡是以[]中括号括起來的參數都是可選參數,在下面這張圖檔中我們看到的參數辨別 和 參數值外面又嵌套了一個中括号[]其表示這個整體都是可以選擇的,我們會發現一些getxxx的這類[]可選參數較多,大多數不需要填寫任何參數就能夠成功執行,以start開頭的則比較少是因為你必須要傳遞至少一個參數
powershell的參數分為 [整體可選],[參數辨別名可選 參數值必選],[參數辨別名必選 參數名必選],[開關參數可選],具體見下圖
get-help dir -showwindow 可以彈出一個視窗顯示指定指令的詳細幫助
在彈出的指令幫助的右上角我們可以通過點選 設定 按鈕,選擇要顯示的幫助部分,我這裡是選擇了全部
get-help get-help -detailed -example -full -online -showwindow,這個指令不能夠直接執行,分别是擷取幫助文檔的細節、示例、全部、線上、顯示視窗幫助文檔
get-command|out-gridview ,我個人使用powershell比較喜歡這種輸出方式,彈出來一個界面,然後可以對指令進行篩選,比較直覺
get-help ✲about✲ ,我想談一談關于powershell的about系列的指令,關于xxx的幫助文檔更加的有意思,有了很多延伸的擴充,沒事的時候大家都可以去看一看,有很多指令的延伸
get-help about_Aliases -showwindow about關于系列的指令 如下所示,我們可以看到其中的一些幫助資訊
update-help -erroraction silentlycontinue,update-help -UICulture cn-zh -ErrorAction SilentlyContinue,通常我們都是直接使用 update-help 來更新本地的幫助檔案,但當出現一些錯誤的時候,就會停止更新,後面的-erroraction參數指明了當出現錯誤時的操作 為靜默繼續更新,第二個指令則指定了更新的語言為中文,英文則為en_US
psprovider,get-psprovider,psdrive,get-psdrive,看似四個指令實際兩個指令,psprovider 用于擷取指令的一些分類資訊,psdrive用于擷取powershell支援的驅動器,dir可周遊的。psprovider中的shouldprocess 類型的指令支援 -whatif -confirm開關參數,Credentials則需要憑證,Filter是支援過濾的意思,Transaction主要用于事務送出 復原
dir alias:;dir cert:;dir cert: -recurse;dir env:;dir function:;dir wsman:;dir variable:;dir HKCU:;dir HKLM:; ,下圖中展示了這些指令的執行結果
get-command ✲start-✲ ,在powershell中 ✲ 星号符的意思是通配符,可以比對任意字元任意次,我們隻需指定指令字元串中的一部分就能夠擷取包含指定字元串的内容
get-location pwd gl,通過get-location 我們可以擷取目前路徑,這個類似于批進行中的百分比号引用的 cd ,以及linux中的pwd,當然在powershell中我們也可以使用pwd
cd hkcu:我麼可以通過cd指令直接進入系統資料庫中,這裡的cd指令其實就是set-location
get-itemproperty hkcu:可以擷取項相關的屬性資訊,這裡擷取的是系統資料庫鍵相關的資訊,比如HKCU的全寫其實就是 HKEY_CURRENT_USER,如果是盤符路徑的話又是别的顯示方式了
get-help set-itemproperty -example ,考慮到使用這個指令的機會比較少,我做一個簡單的介紹,set-itemproperty 主要用于修改檔案夾 檔案 系統資料庫項的屬性值
(dir NuGet -r).FullName ,此指令将擷取包含nuget的所有路徑名,并最終以絕對路徑名的方式顯示出來,這裡的-r 代表的是 -recurse 周遊的意思
get-service|sort-object DisplayName ,我們通過powershell get-service得到的指令,其實與services.msc面闆中的服務名稱一樣,隻不過我們使用sort-object 排序得到的結果是漢字服務名在上,英文服務名在下
$content = get-content 1.txt,将從1.txt 擷取所有内容,并指派給$content 這個變量
new-alias hp get-help ,來談一談new-alias 這個指令,這是一個建立新的别名的指令,需要注意的是參數 new-alias 新的名稱 後面是系統的原始指令
get-member -inputobject $sArr ,這個指令将擷取數組的成員方法和屬性,平時我們通過管道符傳遞對象,每次隻能傳遞數組或者List中的一個對象(忽略重複的相同的對象),這就導緻擷取的是數組或者list中對象類型的成員方法和屬性,而非數組或者list本身的成員方法和屬性
,$sArr|gm 和 ,(1,2,3)|gm ,基于這個原理,我們也可以使用一種别緻的形式将整個數組作為數組中的一個對象通過管道符傳遞給get-member ,以此來擷取數組或者List等資料類型的正确的成員方法和屬性
get-help ✲about✲ 和 get-help about_Comparison_Operators -showwindow ,首先我們擷取比較操作符相關的指令,然後以showwindow的方式顯示出來
-eq 等于 -le 小于等于 -lt 小于 -gt 大于 -ge 大于等于 -ne 不等于 -eq 等于(不區分大小寫) -ieq 等于 (不區分大小寫) -ceq(區分大小寫) ieq 和 eq 一樣 ,前面加i的和沒加的一樣,加c的都是區分大小寫的
get-help ✲about✲script✲ 和 get-help about_Script_Blocks -showwindow ,script_blocks 腳本塊,同樣我們這裡以get-help的方式擷取script_blocks的幫助
$commands={echo 1;echo 2;echo 3} 和 $commands 和 &$commands ,在腳本塊中的語句用分号;隔開,當你回車的時候隻顯示語句,并沒有執行,如果要執行,我們在變量前面加上 and & 連接配接符來調用即可
get-module -listAvailable|where {$_ -like "✲selenium✲"} 用于在本地查找子產品 ,find-module ✲selenium✲ 用于在網際網路 準确的來說是在powershellgallery這個網站查找子產品
find-module -allversions selenium 可以查找目前指定的子產品的所有版本,有一些beta版本在顯示出來的時候可能會格式化錯誤
當我們将子產品安裝好之後,是可以直接使用裡面的指令的,而無需再使用import-module 這個指令。這張圖中先是使用get-module 檢視目前powershell視窗會話加載了那些子產品,然後直接了selenium子產品中的指令打開浏覽器,再使用get-module會發現selenium子產品已經加載
remove-module selnium 将會從目前powershell視窗會話中移除 slenium子產品,但是說實話這個過程其實沒有什麼意義,import-module以及remove-module就我現在的感覺而言沒有使用的價值,因為現在的子產品指令都是用到即加載的,非常的動态,是以這兩個指令也就顯的多餘了
install-module -name xmysql ,就比如說我們安裝這個xmysql吧,使用instal-module -name 的方式進行安裝 ,輸入A ,它就會自動下載下傳安裝
update-module這個指令有三種傳回結果,一種是沒有新版本,那就是沒有任何提示,一種是非install-module安裝的,提示你不能更新,一種是有新版本,會提示你是否進行更新yes no 等選項供你選擇
uninstall-module xmysql powershell 删除子產品的方式也非常簡單,直接一行指令即可,解除安裝完畢後也不會有任何提示,總的來看powershell對于module的操作都挺直覺的。另外uninstall-module 支援同時删除多個子產品,module名之間用逗号分隔開即可
get-help ✲about✲module✲ 和 help ✲about✲module✲ 我是不推薦大家使用help的,help指令在powershell中是一個函數,不是一個正經指令,使用起來經常出現一些莫名奇妙的問題,建議全部使用get-help這個指令 來查詢幫助
foreach foreach-object 首先需要說明的是foreach 不是powershell的文法,這非常重要,很多人将它當做for使用,但他實際是一個指令。而像for if switch 這些都是powershell的文法
get-help foreach -showwindow ,foreach的幫助真的讓人很迷惑,因為通篇都是接收管道符傳遞對象使用foreach語句進行周遊的方式。全篇沒有提到foreach的正常模式,即Foreach($<item> in $<collection>){Statement-1;Statement-2;Statement-N } ,并且在網際網路上也沒有找到相關資訊,這讓我一度以為穿越了。。
這張圖詳展現了powershell foreach的準确用法,對于管道符而言,更像是foreach 和 $_ 的配合,$_不像是一個全部的集合,而是每次傳遞一個對象供scriptblock使用
read-host write-host write-output,write-output "nihaoshijie"|select length 和 write-output "nihaoshijie"|where {$_.length -lt 10} ,write-host不會傳遞對象,而是直接将内容輸出到控制台,write-output不受這個限制,可以使用管道符
ps notepad|kill ,這個指令的全寫是get-process notepadstop-process ,它可以擷取所有程序名為notepad的程序,然後通過管道符傳遞給stop-process 并一個一個将其全部終止
dir|gm|where {$_.membertype -like "Property"}|select Name -unique|foreach {$str =$_.name + "," + $str} ,此指令将擷取dir輸出檔案以及檔案夾資訊的所有屬性,主要為format-table 以及 format-list 等指令提供屬性名資訊
dir|format-table -property Root,Parent,Name,LastWriteTimeUtc,LastWriteTime,LastAccessTimeUtc,LastAccessTime,FullName,Extension,Exists,CreationTimeUtc,CreationTime,Attributes,Length,IsReadOnly,DirectoryName,Directory -autosize -groupby name
在上面那張圖裡面我們隻給出了所有的指令,這裡我們來探讨一下,-wrap 和 -groupby ,wrap 會顯示所有的内容,如果最後無法顯示的将會另起一行繼續顯示。groupby name 則會以指定的屬性對路徑進行分組
在這張新的指令圖中,我們沒有指定 -warp 得到的輸出是 ... 也就是說螢幕放不下的内容以省略号進行了替代
我們右鍵視窗屬性,進入布局 螢幕緩沖區大小,将寬度由300調整為360,然後重新執行指令會發現内容可以顯示完全了,并且有了多餘的空間
format-table 實際重要的參數 就是四個 -property 執行要顯示的,格式化的屬性資訊,這個可以通過gm以及select where來擷取,-autosize将顯示的長度大小自動控制在等寬的列長度中,得到的輸出更加緊湊,以顯示更多的資訊,-groupby 和 -wrap已經講過不再重複
dir|format-table -property FullName,CreationTime,@{name="size(kb)";expression={$size = $_.length1kb -as [int];if($size -gt 1024){echo (($size1024 -as [int]).toString()+" mb")} else {echo ($size.toString()+" kb")}}}自動比對檔案大小kb mb
powershell 哈希表的定義
powershell 腳本執行政策種類 分為 allsigned remotesigned restricted 不允許執行任何腳本 unrestricted 可以運作所有腳本 bypass 忽略配置好的
在組政策中我們我們可以一次 點開 計算機配置 管理模闆 windows元件 windowspowershell 來啟用腳本執行
我們在組政策中看到的windowspowershell 未配置 其實在powershell 中通過 get-executionpolicy -list 擷取的就是 undefine 未定義