gpt4 book ai didi

powershell - 如何在返回名称与驱动器相关的文件时查询临时 PS 驱动器?

转载 作者:行者123 更新时间:2023-12-04 01:06:57 30 4
gpt4 key购买 nike

我正在尝试创建一个脚本,我将在其中搜索文件服务器的非继承权限。结果,我遇到了文件名 260 个字符的限制。我看到的一个建议,我认为会有所帮助,有几次是创建一些非持久性的 PS 驱动器,深度为几个级别并查询它们。

问题是当我使用 Get-ChildItem 时针对新的 PS 驱动器,它返回具有完整网络路径的对象,而不是使用我分配的名称。

# Cycle the folders
Get-ChildItem $rootPath -Directory | select -first 1 | ForEach-Object{
$target = $_

# Create a PS Drive for each sub directory and get all the folders
[void](New-PSDrive -Name $target.Name -PSProvider FileSystem $target.FullName)

# Get the file objects.
Get-ChildItem "$($target.Name):\" -Recurse
}

我确信如果我创建了一些带有驱动器号的合适的持久网络驱动器,我就不会遇到这个问题。

希望我没有错过它,但 Technet for New-PSDrive对这种情况并不是 100% 清楚。

我正在寻找一种方法来制作 ps-drive 并引用那里的文件夹,同时返回相对于新驱动器名称的路径。考虑我制作的 psdrive (G:) 的输出,然后是我映射的网络驱动器之一 (M:)。

PS M:\> Get-ChildItem G:\

Directory: \\server01\COMMON\Folder

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 6/18/2011 8:14 AM Folder 1
d---- 6/18/2011 8:14 AM Folder 2

PS M:\> Get-ChildItem M:\

Directory: M:\

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 5/8/2015 11:00 AM Backup
d---- 5/8/2015 11:00 AM covers
d---- 5/8/2015 11:00 AM drop
d---- 5/8/2015 11:00 AM Expense

我知道针对我的具体情况存在多种解决方法,但我想了解我在 New-PSDrive 中显示的行为.

最佳答案

看起来您混淆了两种不同的东西:PowerShell 路径和提供程序路径。 PowerShell 路径在 PowerShell 之外不可见。

New-PSDrive X FileSystem C:\Windows
(Get-Item X:\System32\notepad.exe).get_Length() #OK
([IO.FileInfo]'X:\System32\notepad.exe').get_Length() #Error

但是 Get-Item X:\System32\notepad.exe设法创建了一个 FileInfo对象,代表某个文件。那么,结果 FileInfo 代表什么文件对象?
(Get-Item X:\System32\notepad.exe).FullName
# C:\Windows\System32\notepad.exe

FileInfo对象对 PowerShell 驱动器一无所知 X: ,它必须存储一个路径,该路径在内部使用它可以理解的文件系统 API。您可以使用 Convert-Path将 PowerShell 路径转换为提供程序路径的 cmdlet:
Convert-Path X:\System32\notepad.exe
# C:\Windows\System32\notepad.exe

创建指向某个网络路径的 PowerShell 驱动器时也会发生同样的情况:
New-PSDrive Y FileSystem \\Computer\Share
Get-ChildItem Y:\

已退回 FileInfoDirectoryInfo对象一无所知 Y: ,因此它们不能具有相对于该 PowerShell 驱动器的路径。内部使用的文件系统 API 不会理解它们。

当您使用 -Persist 时,情况会发生变化选项。在这种情况下,将创建真正的映射驱动器,这可以被 PowerShell 之外的文件系统 API 理解。
New-PSDrive Z FileSystem \\Computer\Share -Persist|Format-Table *Root
# Root : Z:\
# DisplayRoot : \\Computer\Share

如您所见, Root不会 \\Computer\Share如您所问 New-PSDrive cmdlet,但是 Z:\ .自 Z:在这种情况下是真正的驱动器, FileInfoDirectoryInfo Get-Item 返回的对象或 Get-ChildItem cmdlet 可以有相对于它的路径。

关于powershell - 如何在返回名称与驱动器相关的文件时查询临时 PS 驱动器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34812349/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com