【问题标题】:Powershell: Move Items Based on Destination from HashtablePowershell:根据目标从哈希表移动项目
【发布时间】:2014-04-23 04:36:39
【问题描述】:

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

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

  2. 脚本应在第一个破折号(“-”)之前查找“testingcenter123456”,然后参考哈希表以获取匹配键。所有文件都遵循上面显示的格式。

  3. 一旦找到该键,它应该使用该键的对应值(例如:“c:\temp\destination\customer7890”)作为目标文件路径并将文件复制到那里。

    李>

我环顾 StackOverflow,发现一些问答似乎回答了类似问题的一部分,但事实上我对此很陌生,导致我拼凑的脚本根本不起作用。

这是我目前所拥有的:

$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 的知识,我将不胜感激。

【问题讨论】:

  • 您能告诉我们运行此程序时发生了什么吗? :) 您是否收到错误或意外结果?这将有助于我们查明问题。
  • 有没有打印出$key和$key.value来检查内容(意思是filepath.txt的格式好不好?)

标签: powershell hashtable


【解决方案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"
    }
}

【讨论】:

  • 感谢@Keith Hill 的回复,我遇到了几个与哈希文件本身的各种问题有关的错误。我修复了每个错误,然后运行了我的原始脚本。没有错误,但也没有结果。没啥事儿。感谢您提供有关手动循环遍历哈希表条目的提示。实际上,我使用您的建议重新编写了我的原始脚本,并为每个键返回了“警告:VSMDABC001 没有条目”。我不确定我在这里遗漏了什么,但似乎之前脚本的问题与此问题有关。
  • 此警告告诉您 $hashtable 中不存在密钥“VSMABC001”。您可以检查该文件以确保有该键的条目。使用ConvertFrom-StringData 后检查$hastTable 的内容。我发现我必须加倍反斜杠才能正确读取测试字符串。
  • 是的,我还必须添加双反斜杠。我将仔细研究哈希表。每个条目都会返回错误,所以我猜我在哈希表上做错了。如果您有任何问题,我会进行更多调查,并让您知道。再次感谢您的回复!
  • 搞清楚了——哈希表有问题。再次感谢您的帮助。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
相关资源
最近更新 更多