当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 映射 PowerShell 驱动器的乐趣

作者:精品下载站 日期:2024-12-14 08:04:03 浏览:13 分类:玩电脑

映射 PowerShell 驱动器的乐趣


因为我每天都在 PowerShell 提示符下工作,所以我严重依赖 PSDrive 来快速访问文件和文件夹。由于我可以移动,因此我可能会在家庭办公室的办公桌前工作,也可能会带着我值得信赖的 Thinkpad 在路上。当然,这意味着,我想要一种简单的方法来在这两种情况下提供无缝体验。我想分享我的解决方案以及我在 PSDrives 中获得的一些其他乐趣。

使用驱动器数据

正如您可能想象的那样,我将使用 PowerShell 脚本来处理我的驱动器映射。使用 OneDrive,我可以在我可能使用的所有计算机之间同步脚本文件夹。这意味着我只需在一个位置管理该文件。我从数据开始。您可以使用任何您想要的格式。我使用 CSV 是因为它很简单,而且我的驱动器映射数据是平坦的。

#add some psdrives from this CSV data
$drivedata = @"
"Name","Root","Description"
"S", "c:\scripts"
"T",$(Join-Path "C:\" 'training')
"P",$(Join-Path "C:\" 'presentations'),
"Downloads", $(Join-Path -path $env:userprofile -childpath downloads)
"Docs",$([environment]::GetFolderPath("MyDocuments")),"my Documents folder"
"Drop",$(Join-Path -path $env:userprofile -childpath dropbox)
"One", $env:OneDriveConsumer,"my OneDrive folder"
"GDrive", $(Join-Path -path $env:userprofile -childpath "Google Drive")
"Scores", $(Join-Path -path $env:userprofile -childpath documents\musescore3\scores)
"@

我本可以创建一个外部 CSV 文件来导入,但通过使用此处字符串将数据放入脚本文件中,我可以使用 PowerShell 变量。 $Drivedata 是内存中的 CSV 文件。我可以使用 ConvertFrom-CSV 来“导入”它。

[玩转系统] 映射 PowerShell 驱动器的乐趣

这意味着我可以使用这些数据创建一个 New-PSDrive,其代码如下:

#create the PSDrive if it doesn't already exist and the root path exists
(ConvertFrom-Csv $drivedata).where({
     -Not (Test-Path "$($_.name):\") -AND (Test-Path $_.root) }).foreach({
         $splat = @{
             Name = $_.Name
             Root =$_.root
             PSProvider = 'FileSystem'
         }
         if ($_.Description) { $splat.Add("Description",$_.Description)}
         [void](New-PSDrive @splat) })

此代码使用Where() 和ForeEach() 方法而不是Where-Object 和Foreach-Object,因为这些方法运行得更快一些。这是从我的 PowerShell 配置文件脚本调用的代码,因此我希望它能够快速运行。从技术上讲,这是一个单行命令,但您可以轻松地将其分解为单独的步骤。该表达式正在测试驱动器是否尚不存在,而指定的根目录是否存在。对于每个匹配结果,我正在构建一个哈希表 $splat,其中的参数将被分配到 New-PSDrive。我必须测试是否有描述值并在找到时添加它。最后,运行 New-PSDrive。 [void]() 语法阻止 New-PSDrive 显示结果。您还可以将 New-PSDrive 通过管道传输到 Out-Null,但从技术上讲,使用 [void] 会快几毫秒。这应该映射所有本地 PSDrive。

我在哪里

不过,当我在家时,我还有一些 PSDrive 映射到我的 NAS 设备。我想我可以将它们添加到上面的代码中,因为我正在测试根是否存在,但为了稍微提高性能,我走了一条不同的路线。我决定使用 Get-NetNeighbor 命令来验证我是否可以访问 NAS 设备。我发现这比 ping 或 PowerShell 等效项更快。如果 MAC 地址与预期的 MAC 匹配,我就可以映射驱动器。

#test for NAS MAC and only process NAS drives if at home
Try {
    $gw = Get-NetNeighbor -IPAddress 172.16.10.100 -ErrorAction Stop

    if ($gw.LinkLayerAddress -eq '00-11-32-58-7B-10') {

        #map local drives for admin mode
        $mapped = @{
            M      = "\ds416\media"
            N      = "\ds416\files"
            V      = "\ds416\video"
            Backup = "\ds416\backup"
        }

      ($mapped.GetEnumerator()).ForEach({
                if (! (Test-Path "$($_.name):")) {
                    [void](New-PSDrive -Name $_.name -PSProvider FileSystem -Root $_.value)
                } #if not test-path
            })
    } #if MAC matches NAS
}
Catch {
    Write-Warning "You are not at home or DS416 is offline."
}

我想我不需要测试 MAC 地址,因为如果 Get-NetNeigbor 失败,我很可能使用的是旅行计算机。但是,以防万一我在家并且 IP 寻址出现问题,额外的检查不会造成任何损害。在此代码中,我映射驱动器的方式略有不同。这里,$mapped 是驱动器号和根的哈希表。使用 GetEnumerator() 方法并创建新的 PSDrive(如果尚不存在)。

我向您展示的所有代码都位于在系统之间复制的脚本文件中。在我的 PowerShell 配置文件脚本中,我点了该文件的来源。我在 Windows PowerShell 和 PowerShell 7 CurrentUserAllHosts 配置文件脚本中执行相同的操作。无论版本或主机如何,我都应该始终可以访问我的所有 PSDrive。

做得更多

因为我无法控制自己,所以我需要享受使用 PSDrive 的乐趣,尤其是那些属于文件系统的驱动器。但我会留到另一天再说。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯