使用HashTables的Foreach-Object?

Sim*_*onS 3 powershell

我正在尝试检查一些网络驱动器是通过登录脚本映射的.如果它们未映射,则脚本应该能够映射它们,但下面的代码中的My Foreach-Object不起作用.为什么?我不能在哈希表上使用它吗?

$Hash = @{
    "h:" = "\\server\share";
    "i:" = "\\server\share";
    "j:" = "\\server\share";
    "k:" = "\\server\share";
    "p:" = "\\server\share";
    "z:" = "\\server\share";
    }
        $Hash | ForEach-Object
        {
            If (!(Test-Path $_.Name))
            {
                $map = new-object -ComObject WScript.Network
                $map.MapNetworkDrive($_.Name, $_.Value, $true)
                Write-Host "Mapped That Stuff"
            }
            else
            {Write-Host ($Hash.Name) + ($Hash.Value)}
        }
Run Code Online (Sandbox Code Playgroud)

foreach在这种情况下我该如何使用?或者有更好的方法来解决这个问题,而不是哈希表或foreach循环?

bri*_*ist 10

要迭代a,[hashtable]你需要为它获取一个枚举器:

   $Hash.GetEnumerator() | ForEach-Object {
        If (!(Test-Path $_.Name))
        {
            $map = new-object -ComObject WScript.Network
            $map.MapNetworkDrive($_.Name, $_.Value, $true)
            Write-Host "Mapped That Stuff"
        }
        else
        {Write-Host ($_.Name) + ($_.Value)}
    }
Run Code Online (Sandbox Code Playgroud)


The*_*ian 5

我通常只是使用Keys哈希表的属性来迭代它.所以你的脚本将是:

$Hash = @{
    "h:" = "\\server\share";
    "i:" = "\\server\share";
    "j:" = "\\server\share";
    "k:" = "\\server\share";
    "p:" = "\\server\share";
    "z:" = "\\server\share";
    }
        $Hash.Keys | ForEach-Object
        {
            If (!(Test-Path $_))
            {
                $map = new-object -ComObject WScript.Network
                $map.MapNetworkDrive($_, $Hasj.$_, $true)
                Write-Host "Mapped That Stuff"
            }
            else
            {Write-Host ($_) + ($Hash.$_)}
        }
Run Code Online (Sandbox Code Playgroud)

实际上,看了之后我想我会采用更短的路线,使用Where语句来找到不存在的驱动器,然后映射这些驱动器:

$Hash = @{
    "h:" = "\\server\share";
    "i:" = "\\server\share";
    "j:" = "\\server\share";
    "k:" = "\\server\share";
    "p:" = "\\server\share";
    "z:" = "\\server\share";
    }

$Hash.Keys | Where{!(Test-Path $_)} | ForEach{ New-PSDrive -Name $_.trim(':') -PSProvider FileSystem -Root $Hash.$_ -Persist }
Run Code Online (Sandbox Code Playgroud)

我在New-PSDrive那里使用了cmdlet和-Persist参数,然后创建了一个标准的Windows映射驱动器,您可以通过Windows资源管理器查看和管理,就像任何其他映射驱动器一样.如果您不希望这种映射只是删除-Persist参数,那么它将只为您的脚本映射.