簡體   English   中英

如何在powershell中列出特定目錄的內容?

[英]How to list contents of a specific directory in powershell?

總的來說,我對 Powershell 感到困惑。 很奇怪。 無論如何,我讀過:

Powershell 等效於 Linux: ls -al

所以我現在知道如何列出當前目錄的內容。 但是我怎樣才能列出任意目錄的內容呢?

具體來說,

  • 如何輸入要檢查的路徑?

    • 在 Windows 中, \是目錄分隔符; 但它也是大多數語言中的轉義字符。 我該怎么辦?
    • 我需要單引號嗎? 雙引號? 沒有引號?
  • 我在哪里放置相對於開關的參數? 之后,就像我習慣的那樣,或者更確切地說是之前?

  • 如果我想使用環境變量或 powershell 變量作為列表路徑的一部分 - 我該怎么做?

一般 PowerShell 信息和示例:

PowerShell 原生命令(包括選擇加入的用戶編寫的命令)具有標准化的參數語法和綁定規則,因此以下主要針對Get-ChildItem的命令通常適用:

  • 請參閱Get-ChildItem的幫助主題,其中描述了命令的用途、語法和各個參數,並顯示了示例。

    • 如果您安裝了脫機幫助(在Windows PowerShell中默認為 true;可通過 PowerShell (Core) 7+ 中的Update-Help按需安裝),您還可以使用Get-Help -Example Get-ChildItem | more打印示例Get-Help -Example Get-ChildItem | more
  • 至於如何通常閱讀描述 cmdlet 幫助主題的SYNTAX標題下列出的受支持參數的表示法,PowerShell 稱之為語法圖,請參閱概念about_Command_Syntax幫助主題。

  • 離線,您可以使用標准開關打印 PowerShell 原生命令的語法圖-? 或通過將命令名稱傳遞給Get-Command -SyntaxGet-ChildItem -?Get-Command -Syntax Get-ChildItem )。 要離線訪問幫助文本,您可能必須先安裝本地幫助,如上所述。

例子

# The following commands all pass "\" (the [current drive's] root dir)
# to the -Path parameter.
# Note: 
#  * "\" is NOT special in PowerShell, so it needs no escaping.
#    PowerShell allows use of "/" instead even on Windows.
#  * -Path arguments are interpreted as wildcard patterns, whether
#     quoted or not. You may pass *multiple* paths / patterns.
#  * Switch -Force - which, as all switches - can be placed anywhere
#    among the arguments, requests that *hidden* items be listed too.

Get-ChildItem -Path \ -Force
Get-ChildItem \ -Force  # ditto, with *positional* param. binding
'\' | Get-ChildItem     # ditto, via the pipeline.
Get-ChildItem / -Force  # ditto, with "/" as alternative to "\"

# To force interpretation as a *literal* path - which matters for
# paths that contain "[" chars. - use -LiteralPath.
# Here too you may pass *multiple* paths.
Get-ChildItem -LiteralPath \ -Force

# Quoting is needed for paths with spaces, for instance.

# Single-quoting treats the string *verbatim*:
Get-ChildItem 'C:\path\to\dir with spaces'

# Double-quoting *expands* (interpolates) variable references
# and subexpressions.
Get-ChildItem "$HOME\dir with spaces"

# A variable alone can be used as-is, without double-quoting, even
# if its value contains spaces.
Get-ChildItem $HOME

要回答您的具體問題,對於來自 POSIX 兼容外殼(例如 Bash)的讀者

如何輸入要檢查的路徑?

Get-ChildItem提供了兩種方法來指定一個或多個輸入路徑,就像 PowerShell 中的大多數文件處理 cmdlet 一樣:

  • -Path接受一個或多個名稱或路徑,這些名稱或路徑被解釋為通配符模式。

    • 請注意 - 與 POSIX 兼容的 shell(如 Bash)不同 - 路徑是否未引用並不重要; 例如, Get-ChildItem -Path *.txtGet-ChildItem "*.txt"Get-ChildItem '*.txt'都是等價的; 更多關於下面的內容(注意在后兩個調用中偶然省略了-Path ,這使得"*.txt"'*.txt'位置上綁定到第一個位置參數-Path )。
  • -LiteralPath接受一個或多個名稱或路徑,這些名稱或路徑被假定為逐字(逐字)引用現有文件系統項。

    • 鑒於類 Unix 平台上的文字路徑通常包含*? 字符和在 Windows上不能,使用-LiteralPath進行歧義消歧通常只需要包含[ (可能還有] )的路徑,因為PowerShell 的通配符模式語言也支持字符集和范圍(例如[ab][0-9] )。

    • 通過參數綁定到-LiteralPath需要顯式使用-LiteralPath ,即使用命名參數; 例如, Get-ChildItem -LiteralPath foo

    • 但是,通過管道提供System.IO.FileInfo和/或System.IO.DirectoryInfo實例(例如(另一個) Get-ChildItemGet-Item調用的輸出)確實綁定到-LiteralPath ,如本答案中所述。

在 Windows 中, \是目錄分隔符; 但它也是大多數語言中的轉義字符。 我該怎么辦?

在 PowerShell 中\不是轉義字符,因此\實例被視為文字並且不需要轉義; 它是` ,在 PowerShell 中用作轉義字符的所謂反引號- 請參閱概念about_Special_Characters幫助主題。

但是請注意,PowerShell 通常允許您在路徑中互換使用\/ ,這樣,例如Get-ChildItem C:/Windows就可以正常工作。

我在哪里放置相對於開關的參數? 之后,就像我習慣的那樣,或者更確切地說是之前?

筆記:

  • 所有參數在 PowerShell 中都有名稱- 也就是說,選項之間沒有類似 POSIX 的區別(例如-l操作數(僅值參數,例如ls -l / /

  • 命令可以聲明也可以僅按值傳遞的參數,在位置上,這意味着在值前面加上參數名稱是可選的(例如, Get-Path /作為Get-Path -Path /的簡寫)。

只有需要值(參數)的參數才可能僅作為值傳遞 - 取決於目標命令的參數聲明 - 在這種情況下,它們的順序很重要

  • 僅值參數稱為位置參數,它們按順序綁定到聲明為位置的目標命令的那些參數(如果有) - 請參閱此答案以了解如何發現給定命令的哪些參數是位置參數。

  • 通過目標參數(例如-LiteralPath /some/path )為值添加前綴使其成為命名參數。

PowerShell 中的開關(標志),例如-Force ,是一種特殊的參數類型 - 本質上是布爾值 - 根據定義,它需要將其作為命名參數傳遞,通常沒有值(盡管您可以附加值,例如-Force:$true-Force:$false - 請注意:然后需要將參數名稱與其值分開;有關詳細信息,請參閱此答案)。

  • 順便說一句:與 POSIX 兼容的實用程序不同,PowerShell支持具有任何其他類型的可選值的參數 - 請參閱此答案

由於 PowerShell 允許以任何順序指定命名參數,這意味着您可以在命令行的任何位置隨意放置按定義命名的開關參數,例如-Force

簡而言之:順序僅在 PowerShell 中的位置(未命名)參數中很重要

有關詳細信息,請參閱概念about_Parameters幫助主題。

我需要單引號嗎? 雙引號? 沒有引號?

路徑(一般的參數值)需要引用:

  • 如果它包含 PowerShell 元字符,尤其是空格 例如C:\path\to\foo不需要引用,而C:\path with spaces\to\foo則需要。

  • 如果它以子表達式 ( $(...) )開頭,在這種情況下您需要引號,即"..." (見下文) - 盡管您可以選擇始終使用"..." -quoting for涉及子表達式或變量引用的路徑。

  • 請注意, PowerShell沒有與 POSIX 兼容的 shell(如 Bash)中的所謂 shell 擴展等效的概念 因此,給定參數是否被引用在語義上沒有區別(假設它不需要引用); 如上所述, *.txt'*.txt'"*.txt"都是等價的,並且解釋模式的是目標命令,而不是 PowerShell 本身 - 請參閱此答案以獲取更多信息。

如果需要報價:

如果我想使用環境變量或 powershell 變量作為列表路徑的一部分 - 我該怎么做?

要按原樣使用此類變量,不需要引用(即使值包含空格):

# PowerShell variable:
Get-ChildItem -LiteralPath $HOME

# Environment variable, e.g. on Windows:
Get-ChildItem -LiteralPath $env:USERPROFILE

要使變量(或表達式)成為較大字符串的一部分,請將其嵌入可擴展(雙引號)字符串( "..." )中 例如:

Get-ChildItem -LiteralPath "$HOME/Desktop"

筆記:

  • 嵌入表達式命令的輸出需要使用$(...)子表達式運算符 例如
    Get-ChildItem "$(Get-Variable -ValueOnly Home)/Desktop" ; 有關 PowerShell 的可擴展字符串(字符串插值)的完整概述,請參閱此答案

  • 在情況下,例如在上面的示例中,省略"..."引用也可以 - 請參閱此答案以獲取更多信息。

此外,PowerShell 允許您使用(...)分組運算符將任意表達式和命令的結果作為參數傳遞; 以下是上述命令的等效項:

Get-ChildItem -LiteralPath ($HOME + '/Desktop')

或者,使用Join-Path cmdlet:

Get-ChildItem -LiteralPath (Join-Path $HOME Desktop)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM