国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

PowerShell文件系統(二)訪問文件和目錄

2019-11-08 01:39:27
字體:
來源:轉載
供稿:網友

原文地址:http://www.pstips.net/accessing-files-and-directories.html

PowerShell 文件系統系列文章:

PowerShell文件系統(一)前言PowerShell文件系統(二)訪問文件和目錄PowerShell文件系統(三)導航文件系統PowerShell文件系統(四)使用目錄和文件工作PowerShell文件系統(五)管理訪問權限

使用Get-ChildItem列出目錄的內容。預定義的別名為Dirls,Get-ChildItem執行了一些很重要的任務:

顯示目錄內容遞歸地搜索文件系統查找確定的文件獲取文件和目錄的對象把文件傳遞給其它命令,函數或者腳本

注意:因為Windows管理員一般在實踐中,使用Get-ChildItem的別名Dir,所以接下來的例子都會使用Dir。另外ls(來自UNIX家族)也可以代替下面例子中的Dir或者Get-ChildItem。

列出目錄的內容

一般情況下,你可能只想知道在一個確定的目錄中有什么文件,如果你不指定其它參數。Dir會列出當前目錄的內容。如果你在Dir后跟了一個目錄,它的內容也會被列出來,如果你使用了-recurse參數,Dir會列出所有子目錄的內容。當然,也允許使用通配符。

例如,你想列出當前目錄下的所有PowerShell腳本,輸入下面的命令:

1Dir *.ps1

Dir甚至能支持數組,能讓你一次性列出不同驅動器下的內容。下面的命令會同時列出PowerShell根目錄下的PowerShell腳本和Windows根目錄下的所有日志文件。

1Dir $pshome/*.ps1, $env:windir/*.log

如果你只對一個目錄下的項目名稱感興趣,使用-Name參數,Dir就不會獲取對象(Files和directories),只會以純文本的形式返回它們的名稱。

1Dir-name

注意:一些字符在PowerShell中有特殊的意義,比如方括號。方括號用來訪問數組元素的。這也就是為什么使用文件的名稱會引起歧義。當你使用-literalPath參數來指定文件的路徑時,所有的特殊字符被視為路徑片段,PowerShell解釋器也不會處理。

荔非苔注:Dir 默認的參數為-Path。假如你當前文件夾下有個文件名為“./a[0].txt“,因為方括號是PowerShell中的特殊字符,會解釋器被解析。為了能正確獲取到”./a[0].txt”的文件信息,此時可以使用-LiteralPath參數,它會把你傳進來的值當作純文本。

PS> Get-ChildItem ./a[0].txtPS> Get-ChildItem -Path ./a[0].txtPS> Get-ChildItem -LiteralPath ./a[0].txt    Directory: C:/Users/mosserMode                LastWriteTime     Length Name----                -------------     ------ -----a---          2014/1/2     14:04      80370 a[0].txt

遞歸搜索整個文件系統

當你想搜索整個子目錄時,可以使用-recurce參數。但是注意,下面例子執行時會失敗。

1Dir *.ps1 -recurse

你需要了解一點-recurse如何工作的細節來理解為什么會發生上面的情況。Dir總是會獲取目錄中的內容為文件對象或者目錄對象。如果你設置了-recurse開關,Dir會遞歸遍歷目錄對象。但是你在上面的例子中使用的通配符只獲取擴展名為ps1的文件,沒有目錄,所以-recurse會跳過。這個概念剛開始使用時可能有點費解,但是下面的使用通配符例子能夠遞歸遍歷子目錄,正好解釋了這點。

在這里,Dir獲取了根目錄下所有以字母“D”打頭的項目。遞歸開關起了作用,那是因為這些項目中就包含了目錄。

1Dir $home/d*-recurse

荔非苔注:原文的作者寫這篇文章時,是基于PowerShell 2.0,在高版本中的PowerShell 中Dir *.ps1 -recurse也是可以工作的。

過濾和排除標準

現在回到剛開始問題,怎樣遞歸列出同類型的所有文件,比如所有PowerShell scripts。答案是使用Dir完全列出所有目錄內容,同時指定一個過濾條件。Dir現在可以過濾出你想要列出的文件了。

1Dir $home-filter *.ps1 -recurse

除了-filter,還有一個參數乍一看和-filter使用起來很像: -include

1Dir $home-include *.ps1 -recurse

你會看到這一戲劇性的變化,-filter的執行效率明顯高于-include:

1234(Measure-Command{Dir $home-filter *.ps1 -recurse}).TotalSeconds4,6830099(Measure-Command{Dir $home-include *.ps1 -recurse}).TotalSeconds28,1017376

其原因在于-include支持正則表達式,從內部實現上就更加復雜,而-filter只支持簡單的模式匹配。這也就是為什么你可以使用-include進行更加復雜的過濾。比如下面的例子,搜索所有第一個字符為A-F的腳本文件,顯然已經超出了-filter的能力范圍。

1234# -filter 查詢所有以 "[A-F]"打頭的腳本文件,屁都沒找到Dir $home-filter [a-f]*.ps1-recurse# -include 能夠識別正則表達式,所以可以獲取a-f打頭,以.ps1收尾的文件Dir $home-include [a-f]*.ps1-recurse

與-include相反的是-exclude。在你想排除特定文件時,可以使用-exclude。不像-filter,-include和-exclude還支持數組,能讓你獲取你的家目錄下所有的圖片文件。

1Dir $home-recurse -include *.bmp,*.png,*.jpg, *.gif

做到一點即可:不要混淆了-filter 和 -include。選擇這兩個參數中的其中一個:具體為當你的過濾條件沒有正則表達式時,使用-filter,可以顯著提高效率。

注意:你不能使用filters在Dir中,列出確定大小的文件列表。因為Dir的限制條件只在文件和目錄的名稱級別。如果你想使用其它標準來過濾文件,可以嘗試第五章中講到的Where-Object。

下面的例子會獲取你家目錄下比較大的文件,指定文件至少要100MB大小。

1Dir $home-recurse Where-Object$_.length -gt100MB }

如果你想知道Dir返回了多少個文件項,Dir會將結果保存為一個數組,你可以通過數組的的Count屬性來讀取。下面的命令會告訴你你的家目錄下有多少圖片文件(這個操作可能會比較耗時)。

獲取文件和目錄的內容

你可以使用Dir直接獲取一個單獨的文件,因為Dir會返回一個目錄下所有的文件和目錄對象。下面的例子會得到這個文件的FileInfo信息:

$file = Dir C:/a.html$file | Format-List *
PSPath            : Microsoft.PowerShell.Core/FileSystem::C:/a.htmlPSParentPath      : Microsoft.PowerShell.Core/FileSystem::C:/PSChildName       : a.htmlPSDrive           : CPSPRovider        : Microsoft.PowerShell.Core/FileSystemPSIsContainer     : FalseVersionInfo       : File:             C:/a.html                    InternalName:                    OriginalFilename:                    FileVersion:                    FileDescription:                    Product:                    ProductVersion:                    Debug:            False                    Patched:          False                    PreRelease:       False                    PrivateBuild:     False                    SpecialBuild:     False                    Language:BaseName          : aMode              : -a---Name              : a.htmlLength            : 227740DirectoryName     : C:/Directory         : C:/IsReadOnly        : FalseExists            : TrueFullName          : C:/a.htmlExtension         : .htmlCreationTime      : 2013/11/12 19:29:16CreationTimeUtc   : 2013/11/12 11:29:16LastAccessTime    : 2013/11/12 19:29:16LastAccessTimeUtc : 2013/11/12 11:29:16LastWriteTime     : 2013/11/12 19:29:24LastWriteTimeUtc  : 2013/11/12 11:29:24Attributes        : Archive

你可以訪問單個文件的屬性,如果它們的屬性支持更改,也可以更改。

PS> $file.AttributesArchivePS> $file.Mode-a---

Get-Item是訪問單個文件的另外一個途徑, 下面的3條命令都會返回同樣的結果:你指定的文件的文件對象。

123$file= Dir c:/autoexec.bat$fileGet-Childitemc:/autoexec.bat$fileGet-Itemc:/autoexec.bat

但是在訪問目錄而不是文件時,Get-Childitem 和 Get-Item表現迥異。

1234# Dir 或者 Get-Childitem 獲取 一個目錄下的內容:$directory= Dir c:/windows$directoryGet-Childitemc:/windows$directory
    Directory: C:/windowsMode                LastWriteTime     Length Name----                -------------     ------ ----d----         2013/8/22     23:36            addinsd----         2013/8/22     23:36            ADFSd----         2013/8/22     23:36            AppCompatd----        2013/11/22     19:13            apppatchd----        2013/12/27     12:05            AppReadinessd-r--        2013/12/17      3:44            assemblyd----         2013/9/16     10:11            AUInstallAgentd----         2013/8/22     23:36            Bootd----         2013/8/22     23:36            Brandingd----        2013/10/24     14:27            Camera
123# Get-Item 獲取的是目錄對象本身:$directoryGet-Itemc:/windows$directory
    Directory: C:/Mode                LastWriteTime     Length Name----                -------------     ------ ----d----        2013/11/22     19:13            windows
PS> $directory | Format-List *PSPath            : Microsoft.PowerShell.Core/FileSystem::C:/windowsPSParentPath      : Microsoft.PowerShell.Core/FileSystem::C:/PSChildName       : windowsPSDrive           : CPSProvider        : Microsoft.PowerShell.Core/FileSystemPSIsContainer     : TrueBaseName          : windowsMode              : d----Name              : windowsParent            :Exists            : TrueRoot              : C:/FullName          : C:/windowsExtension         :CreationTime      : 2013/8/22 21:36:15CreationTimeUtc   : 2013/8/22 13:36:15LastAccessTime    : 2013/11/22 19:13:22LastAccessTimeUtc : 2013/11/22 11:13:22LastWriteTime     : 2013/11/22 19:13:22LastWriteTimeUtc  : 2013/11/22 11:13:22Attributes        : Directory

向命令,函數和文件腳本傳遞文件

因為Dir的結果中返回的是獨立的文件或目錄對象,Dir可以將這些對象直接交付給其它命令或者你自己定義的函數與腳本。這也使得Dir成為了一個非常重要的的選擇命令。使用它你可以非常方便地在一個驅動盤下甚至多個驅動盤下遞歸查找特定類型的所有文件。

要做到這點,在管道中使用Where-Object來處理Dir返回的結果,然后再使用ForEach-Object(第五章),或者你自定義的管道過濾(第九章)。

小知識:你還可以將多個Dir 命令執行的結果結合起來。在下面的例子中,兩個分開的Dir命令,產生兩個分開的文件列表。然后PowerShell將它們結合起來發送給管道進行深度處理。這個例子獲取Windows目錄和安裝程序目錄下的所有的dll文件,然后返回這些dll文件的名稱,版本,和描述:

123456789$list1= Dir $env:windir/system32/*.dll$list2= Dir $env:programfiles-recurse -filter *.dll$totallist$list1$list2$totallistForEach-Object{$info=[system.diagnostics.fileversioninfo]::GetVersionInfo($_.FullName);"{0,-30} {1,15} {2,-20}" -f $_.Name, `$info.ProductVersion, $info.FileDescription}
accessibilitycpl.dll            6.3.9600.16384 Ease of access  control panelACCTRES.dll                     6.3.9600.16384 Microsoft Internet Account Manager Resourcesacledit.dll                     6.3.9600.16384 Access Control List Editoraclui.dll                       6.3.9600.16384 Security Descriptor Editoracppage.dll                     6.3.9600.16384 Compatibility Tab Shell Extension Libraryacproxy.dll                     6.3.9600.16384 Autochk Proxy DLLActionCenter.dll                6.3.9600.16384 Action CenterActionCenterCPL.dll             6.3.9600.16384 Action Center Control PanelActionQueue.dll                 6.3.9600.16384 Unattend Action Queue Generator / Executoractiveds.dll                    6.3.9600.16384 ADs Router Layer DLLactxprxy.dll                    6.3.9600.16425 ActiveX Interface Marshaling Libraryadhapi.dll                      6.3.9600.16384 AD harvest sites and subnets APIadhsvc.dll                      6.3.9600.16384 AD Harvest Sites and Subnets Service

因為Dir獲取的文件和目錄是一樣的,有時限制結果中只包含文件或者只包含目錄很重要。有很多途徑可以做到這點。你可以驗證返回對象的屬性,PowerShell PSIsContainer屬性,或者對象的類型。

12345678# 只列出目錄::Dir | Where-Object$_-is [System.IO.DirectoryInfo] }Dir | Where-Object$_.PSIsContainer }Dir | Where-Object$_.Mode.Substring(0,1) -eq"d" }# 只列出文件:Dir | Where-Object$_-is [System.IO.FileInfo] }Dir | Where-Object$_.PSIsContainer -eq$false}Dir | Where-Object$_.Mode.Substring(0,1) -ne"d" }

前面的例子(識別對象類型)是目前速度最快的,而后面的(文本比較)比較復雜和低效。

Where-Object也可以根據其它屬性來過濾。

比如下面的例子通過管道過濾2007年5月12日后更改過的文件:

1Dir | Where-Object$_.CreationTime -gt[datetime]::Parse("May 12, 2007") }

也可以使用相對時間獲取2周以內更改過的文件:

1Dir | Where-Object$_.CreationTime -gt(Get-Date).AddDays(-14) }

原文地址:Working with the File System

本文鏈接: http://www.pstips.net/accessing-files-and-directories.html請尊重原作者和編輯的辛勤勞動,歡迎轉載,并注明出處!


相關文章推薦:

PowerShell文件系統(一)前言PowerShell文件系統(五)管理訪問權限PowerShell文件系統(四)使用目錄和文件工作PowerShell文件系統(三)導航文件系統Powershell 快捷鍵Powershell 調用操作符Powershell函數 過濾器 管道Powershell Foreach 循環Powershell復制數組PowerShell注冊表(四)創建和刪除鍵值


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大方县| 枣强县| 宜都市| 南溪县| 福州市| 诸暨市| 崇礼县| 濮阳市| 仙游县| 永嘉县| 桐柏县| 郑州市| 邹平县| 乳山市| 日照市| 华池县| 大竹县| 重庆市| 贞丰县| 怀化市| 东台市| 台东市| 永修县| 甘肃省| 泗阳县| 贵定县| 六盘水市| 游戏| 新巴尔虎右旗| 秦皇岛市| 惠东县| 昌图县| 宜君县| 莱芜市| 禹州市| 丰都县| 乐平市| 安宁市| 伊川县| 安陆市| 读书|