Powershell 获取文件夹中文件的列表,并使用ForEach&;将其移动到4个子文件夹中;转换

Powershell 获取文件夹中文件的列表,并使用ForEach&;将其移动到4个子文件夹中;转换,powershell,foreach,switch-statement,Powershell,Foreach,Switch Statement,假设我有一个命令,从名为Copy的文件夹中获取4个文件名到一个数组: $Files2 = Get-ChildItem "Copy" -File 在我当前的目录中,有两个文件夹Copy和Work(包含4个文件夹实验室、作业、讲座、脚本) 我的目标是将4个文件从Copy移动到相应的4个文件夹中,并使用匹配的名称。例如,文件Lab12将进入文件夹Labs。我的脚本遇到了一个错误,因为它无法在不更改目录的情况下确定文件的放置位置 $Files2 = Get-ChildItem "Copy" -File

假设我有一个命令,从名为
Copy
的文件夹中获取4个文件名到一个数组:

$Files2 = Get-ChildItem "Copy" -File
在我当前的目录中,有两个文件夹
Copy
Work
(包含4个文件夹
实验室、作业、讲座、脚本

我的目标是将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
,它将按预期工作。我在这方面哪里出了问题?我知道它试图在我当前的目录中查找文件,但我很难找到我还没有尝试过的其他可能性。我还没有学会哈希表,所以我使用了开关

编辑:


我还应该说我试着把
-Destination“Work\teaches”
放在我的
Switch
语句中,但那也不起作用。

不管Olaf怎么建议,你确实可以使用
$\ucode>,因为
Switch
会遍历数组,和
$\u
表示数组中的当前项。您需要指定项目的
FullName
属性,或者将
$\ucode>导入到
移动项目
。您还需要提供有效的相对路径。这可以工作(在我的机器上测试):


不管Olaf如何建议,您确实可以使用
$\u
,因为
开关
将遍历数组,而
$\u
表示数组中的当前项。您需要指定项目的
FullName
属性,或者将
$\ucode>导入到
移动项目
。您还需要提供有效的相对路径。这可以工作(在我的机器上测试):


您正在使用管道变量$\ux,但没有管道。;-)
$\uuu
不是指正在测试的阵列的当前项吗?即使如此,代码仍然应该执行,但它不会执行。对于这个脚本,
$i
$\ucode>应该是可互换的。控制台中有一个示例错误:
Move Item:找不到路径“C:\Users\Work\Lab12.txt”,因为它不存在。
在循环声明中使用$i,而不是$\ux。如果您不确定是否可以使用写入详细信息来输出变量中的内容或仅用于测试写入主机。您可以使用完整路径而不是相对路径?使用问题中最初发布的代码将
$\ucode>更改为
$\uFullName
,并将目标更改为相对路径,例如
“\Work\toucks”
您正在使用管道变量$\uu,但您没有管道。;-)
$\uuu
不是指正在测试的阵列的当前项吗?即使如此,代码仍然应该执行,但它不会执行。对于这个脚本,
$i
$\ucode>应该是可互换的。控制台中有一个示例错误:
Move Item:找不到路径“C:\Users\Work\Lab12.txt”,因为它不存在。
在循环声明中使用$i,而不是$\ux。如果您不确定是否可以使用写入详细信息来输出变量中的内容或仅用于测试写入主机。您可以使用完整路径而不是相对路径?使用问题中最初发布的代码将
$\ucode>更改为
$\uFullName
,并将目标更改为相对路径,例如
“\Work\toucks”
$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"}
}