如何从 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。如果我犯了错误,我想很抱歉 - 我试过了!
在此代码中:
- 轮流注释掉和取消注释顶部附近的“Objects =”行。
- 记下注释掉的“$_ | Format-List -属性 *”。如果您取消注释,它将生成一个长输出,其中包含被送入管道的对象中的所有属性。您可以使用它来查看我主要是如何访问这些对象来设置变量的。
- 注意代码中SubString的使用。我很难证明 SubString 在 PowerShell 核心中可用,但如果是的话,它是一种可用于将路径分成几部分的工具。另一个工具是 Split-Path,因此您可能需要研究一下。
- 如果您有所需单个文件的确切名称,请在下面的代码中将 *.ps1 替换为该确切名称。或者在许多命令中,在路径末尾添加 \FileName.ext 都可以。
- 此代码在 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"
}
当我在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。如果我犯了错误,我想很抱歉 - 我试过了!
在此代码中:
- 轮流注释掉和取消注释顶部附近的“Objects =”行。
- 记下注释掉的“$_ | Format-List -属性 *”。如果您取消注释,它将生成一个长输出,其中包含被送入管道的对象中的所有属性。您可以使用它来查看我主要是如何访问这些对象来设置变量的。
- 注意代码中SubString的使用。我很难证明 SubString 在 PowerShell 核心中可用,但如果是的话,它是一种可用于将路径分成几部分的工具。另一个工具是 Split-Path,因此您可能需要研究一下。
- 如果您有所需单个文件的确切名称,请在下面的代码中将 *.ps1 替换为该确切名称。或者在许多命令中,在路径末尾添加 \FileName.ext 都可以。
- 此代码在 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"
}