Foreach循环将特定文件移动到指定的文件夹中

时间:2018-03-06 00:02:38

标签: powershell foreach

我正在学习PowerShell,我的作业遇到了困难。我的目标是获取当前目录中所有文件的列表,将其保存到变量中。然后使用foreach循环根据文件名将每个文件移动到不同的文件夹,使用文件标签搜索文件名。

文件:

  • 1LectureFile
  • 1LabFile
  • 1AssignmentFile
  • 1.ps1

文件夹:

  • 讲座
  • 实验室
  • 分配
  • 脚本

运行脚本时,文件会进入各自的文件夹。

我必须使用文件标记(例如*lec**lab**Assign**Scripts*)来搜索文件。

这是我到目前为止的代码:

# Gets a list of all file names and saves it to a variable
$Files2 = Get-ChildItem "dir" -File

foreach ($i in $Files2) {
    #My attempt at searching for the files containing lec
    if (gci ($i -eq "*lec*")) {
        #Moves the file that fits the description into Lecture folder
        Move-Item $i -Destination "Lecture"
    # If $i doesn't fit first if, repeats and looks for Lab
    } elseif ("  ") {
        Move-Item "    "
    }
}

我不希望任何人给我答案。任何提示,或提示或一般指南指出我在正确的方向将非常感激。我在线搜索过,但大多数建议的答案对我来说太难理解了(大多数命令我还没有学过)。

2 个答案:

答案 0 :(得分:1)

您的switch可以简化为:

switch -Wildcard ($Files2) {
    "*lec*" {Move-Item $_ -Destination "Lecture"}
    "*lab*" {Move-Item $_ -Destination "Lab"}
    "*assign*" {Move-Item $_ -Destination "Assignment"}
    "*.ps1*" {Move-Item $_ -Destination "Scripts"}
}

switch命令将遍历文件对象数组。在交换机中,我们引用$_,它表示正在测试的数组的当前项。

另一种可以做到的方法是使用哈希表创建一个字典映射,其中每种文件都应该去,然后在select语句中使用-match,并使用自动$matches变量查找每个文件应该放在哈希表中的位置。类似的东西:

$PathLookup = @{
        'lec' = "Lecture"
        'lab' = "Lab"
        'assign' = "Assignment"
        '.ps1' = "Scripts"
}

$Files2 | Where{$_.Name -match '(lec|lab|assign|\.ps1)'} | ForEach{
    Move-Item $_ -Destination $PathLookup[$Matches[1]]
}

答案 1 :(得分:0)

感谢您提供所有有用的提示和技巧。我已成功完成脚本,并且按预期工作。我使用if语句代替使用Switch语句,以提高效率。因为我在循环中添加了更多内容,forloop正在停留,否则我会省略它。

Foreach ($i in $Files2) {

    switch -Wildcard ($i) {
        ("*lec*") {Move-Item $i -Destination "Lecture"}
        ("*lab*") {Move-Item $i -Destination "Lab"}
        ("*assign*") {Move-Item $i -Destination "Assignment"}
        ("*.ps1*") {Move-Item $i -Destination "Scripts"}
    }
}