假设我有一个命令可以将名为Copy
的文件夹中的4个文件名抓取到数组中:
$Files2 = Get-ChildItem "Copy" -File
在我当前的目录中,有2个文件夹Copy
和Work
(包含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
语句中,但这也不起作用。
答案 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"}
}