如何在返回具有相对于驱动器名称的文件时查询临时PS-Drive?

Mat*_*att 12 powershell network-drive powershell-4.0

我正在尝试创建一个脚本,我将在文件服务器中搜索非继承权限.因此,我遇到了文件名的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
}
Run Code Online (Sandbox Code Playgroud)

我相信如果我用驱动器号创建了一些合适的持久性网络驱动器,我就不会遇到这个问题.

希望我只是没有错过它,但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         
Run Code Online (Sandbox Code Playgroud)

我知道我的确切情况存在多种解决方法,但我想了解我所展示的行为New-PSDrive.

use*_*407 7

看起来你混合了两个不同的东西:PowerShell路径和Provider路径.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
Run Code Online (Sandbox Code Playgroud)

Get-Item X:\System32\notepad.exe设法创建一个FileInfo代表一些文件的对象.那么,结果FileInfo对象表示什么文件?

(Get-Item X:\System32\notepad.exe).FullName
# C:\Windows\System32\notepad.exe
Run Code Online (Sandbox Code Playgroud)

由于该FileInfo对象对PowerShell驱动器一无所知X:,因此它必须存储一个路径,该路径在内部使用它可以理解的文件系统API.您可以使用Convert-Pathcmdlet将PowerShell路径转换为提供程序路径:

Convert-Path X:\System32\notepad.exe
# C:\Windows\System32\notepad.exe
Run Code Online (Sandbox Code Playgroud)

创建PowerShell驱动器时会发生相同的情况,该驱动器指向某个网络路径:

New-PSDrive Y FileSystem \\Computer\Share
Get-ChildItem Y:\
Run Code Online (Sandbox Code Playgroud)

返回FileInfoDirectoryInfo对象一无所知Y:,因此它们不能拥有相对于该PowerShell驱动器的路径.内部使用的文件系统API将无法理解它们.

使用该-Persist选项时,情况会发生变化.在这种情况下,将创建实际映射的驱动器,这可以通过PowerShell之外的文件系统API来理解.

New-PSDrive Z FileSystem \\Computer\Share -Persist|Format-Table *Root
# Root        : Z:\
# DisplayRoot : \\Computer\Share
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这Root将不是\\Computer\Share您在New-PSDrivecmdlet中提出的要求,而是Z:\.由于Z:是在这种情况下,真正的驱动器,FileInfoDirectoryInfo对象通过返回Get-ItemGet-ChildItem小命令可以具有相对于它的路径.