如何从 PowerShell 中的 dir 命令中删除当前路径?

How to remove current path from dir command in PowerShell?

当我在Powershell中输入dir命令时,它总是显示当前路径+几个空行,这真是没必要。我想设置一个从结果中删除当前路径的别名。但是 command/attribute 我可以使用什么来删除该路径?我在互联网上或 dir 的手册页上找不到任何内容。

我使用 Powershell 7.2.1 并且是 PS 的新手。

首先,我认为提及 7.2.1 是在吓唬人们,使其不敢尝试回答您的问题。很多人,比如我自己,现在都和 5.x 待在一起。如果我知道如何让 7.x 进入 WinPE,我可能会做出转换。我对此可能是错误的,但这似乎是一个问题。

其次,Dir,在PowerShell中,是Get-ChildItem的别名。 看到这个 List of Compatibility Aliases

第三,你需要看一下Working with Files and Folders, Get-ChildItem, and Get-Item

第四,PowerShell中的一切都是对象。因此,您在 Dir 中看到的所有额外行实际上并不是由 Dir 创建的,它们是格式化绒毛,PowerShell 粘在那里以试图使其可读。 PowerShell 获取了 Dir/Get-ChildItem 返回的对象,并试图使它们对您来说很漂亮,但是当您直接使用这些对象时,所有这些多余的东西都不存在。当您开始使用 Pipeline 时,请记住这一点,它只是一次将一组对象送入管道。

第五,所有版本的 PowerShell 5.x 和更新版本都有相当多的重叠,所以理论上,如果我很小心,我给你的 5.x 代码应该可以工作7.x。如果我犯了错误,我想很抱歉 - 我试过了!

在此代码中:

  1. 轮流注释掉和取消注释顶部附近的“Objects =”行。
  2. 记下注释掉的“$_ | Format-List -属性 *”。如果您取消注释,它将生成一个长输出,其中包含被送入管道的对象中的所有属性。您可以使用它来查看我主要是如何访问这些对象来设置变量的。
  3. 注意代码中SubString的使用。我很难证明 SubString 在 PowerShell 核心中可用,但如果是的话,它是一种可用于将路径分成几部分的工具。另一个工具是 Split-Path,因此您可能需要研究一下。
  4. 如果您有所需单个文件的确切名称,请在下面的代码中将 *.ps1 替换为该确切名称。或者在许多命令中,在路径末尾添加 \FileName.ext 都可以。
  5. 此代码在 Windows 中运行良好,但在另一个 OS 中您可能需要进行调整。
#   Uncomment only one of the following lines at a time:
#$Objects = Get-ChildItem -Path $Home -File                 #   Gets files in home path
#$Objects = Get-ChildItem -Path $Home -Directory           #   Gets Directories in home path
#$Objects = Get-ChildItem -Path $PSScriptRoot -File        #   Gets files in same folder as the script
#$Objects = Get-ChildItem -Path $PSScriptRoot -Directory   #   Gets Directories in same folder as the script
$Objects = Get-ChildItem -Path "$Home\Documents" -File
#$Objects = Get-ChildItem -Path "$PSScriptRoot\*.ps1" -File
#$Objects = Get-Item -Path "$PSScriptRoot\*.ps1"

$Objects  | ForEach-Object {    #   Get files
    #$_ | Format-List -Property *

    $f =$_.FullName                     #   Get full path name
    $d = "$($_.PSDrive):\"     #   Get the drive
    $dp = $_.DirectoryName              #   Get drive and path
    $p = $dp.SubString($d.Length)       #   Get path only
    $n = $_.BaseName                    #   Get file name only
    $x = $_.Extension                   #   Get file extension only
    $nx = $_.Name                       #   Get files name and extension
    
    Write-Host
    Write-Host "f: $f"
    Write-Host "dp: $dp, nx: $nx"
    Write-Host "d: $d, p: $p, n: $n, x: $x"
}