获取文件夹中的文件列表,并使用ForEach& amp ;;将它们移动到4个子文件夹开关

时间:2018-03-07 23:24:17

标签: powershell foreach switch-statement

假设我有一个命令可以将名为Copy的文件夹中的4个文件名抓取到数组中:

$Files2 = Get-ChildItem "Copy" -File

在我当前的目录中,有2个文件夹CopyWork(包含4个文件夹Labs, Assignments, Lectures, Scripts)。

我的目标是将4个文件从Copy移动到相应名称匹配的4个文件夹。例如,文件Lab12将进入文件夹Labs。我的脚本遇到错误,因为它无法在不更改目录的情况下找出放置文件的位置。

$Files2 = Get-ChildItem "Copy" -File

Foreach ($i in $Files2) {
    Switch -Wildcard ($i) {
        ("*lec*") {Move-Item $_ -Destination "Lectures"}
        ("*lab*") {Move-Item $_ -Destination "Labs"}
        ("*assign*") {Move-Item $_ -Destination "Assignments"}
        ("*.ps1*") {Move-Item $_ -Destination "Scripts"}
    }        
    $Count = $Count + 1
}

如果我在循环之前添加Set-Location Work,它会按预期工作。我在哪里错了?我知道它正在尝试查找我当前目录中的文件,但我还是试图弄清楚我还没有尝试过的其他可能性。我还没有学过hashtables,所以我改为使用switches

编辑:

我应该也说过,我尝试将-Destination "Work\Lectures"放在我的Switch语句中,但这也不起作用。

1 个答案:

答案 0 :(得分:2)

尽管奥拉夫建议,你确实可以使用$_,因为Switch将遍历数组,而$_代表数组中的当前项。您需要指定项目的FullName属性,或管道$_Move-Item。您还需要提供有效的相对路径。这有效(在我的机器上测试):

$Files2 = Get-ChildItem "Copy" -File

Switch -Wildcard ($Files2) {
    ("*lec*") {Move-Item $_.FullName -Destination ".\Work\Lectures"}
    ("*lab*") {Move-Item $_.FullName -Destination ".\Work\Labs"}
    ("*assign*") {Move-Item $_.FullName -Destination ".\Work\Assignments"}
    ("*.ps1*") {Move-Item $_.FullName -Destination ".\Work\Scripts"}
}