Powershell:根据目的地从Hashtable移动项目

时间:2014-04-21 20:53:46

标签: powershell hashtable

我尝试编写PowerShell脚本,根据一些条件将文件从一个目录移动到另一个目录。例如:

  1. 文件名示例:testingcenter123456-testtype-222-412014.pdf。

  2. 脚本应该查找" testingcenter123456"在第一个短划线(" - ")之前,然后引用匹配键的哈希表。所有文件都遵循上面显示的格式。

  3. 一旦找到该密钥,就应该使用该密钥的对应值(例如:" c:\ temp \ destination \ customer7890")作为目标文件路径并复制归档那里。

  4. 我环顾了StackOverflow,发现了一些Q& As,它似乎回答了类似问题的部分内容,但事实上我对此非常陌生,导致我拼凑在一起的剧本根本不起作用。

    这是我到目前为止所拥有的:

    $hashTable = ConvertFrom-StringData ([IO.File]::ReadAllText("c:\temp\filepaths.txt"))
    $directory = "c:\temp\source"
    Get-ChildItem $directory |
        where {!($_.PsIsContainer)} |
        Foreach-Object {
        Foreach ($key in $hashTable.GetEnumerator()){
           if ($_.Name.Substring(0,$_.Name.IndexOf("-")) -eq $key.Name){
           Copy-Item -Path $_.fullname -Destination $key.Value
           }
        }
        }
    

    如果有人可以帮助我解决问题,并希望在此过程中学到一些关于PowerShell的东西,我会很感激。

1 个答案:

答案 0 :(得分:1)

老实说,我不明白为什么这不应该奏效。如果你告诉我们哪一行产生错误会很有帮助。

Foreach ($key in $hashTable.GetEnumerator()) {
   if ($_.Name.Substring(0,$_.Name.IndexOf("-")) -eq $key.Name) {
   Copy-Item -Path $_.fullname -Destination $key.Value
   }
}

那就是说,你通过循环遍历其条目,手动匹配密钥,而忽略了使用哈希表的重点。使用哈希表,您不需要循环,例如

$hashTable = ConvertFrom-StringData ([IO.File]::ReadAllText("c:\temp\filepaths.txt"))
Get-ChildItem c:\temp\source |
Where {!($_.PsIsContainer)} |
Foreach-Object {
    $key =  $_.Name.Substring(0,$_.Name.IndexOf("-"))
    $val = $hashtable.$key
    if ($val) {
        $_ | Copy-Item -Dest $val -WhatIf
    }
    else {
        Write-Warning "No entry for $key"
    }
}