我正在学习PowerShell,我的作业遇到了困难。我的目标是获取当前目录中所有文件的列表,将其保存到变量中。然后使用foreach循环根据文件名将每个文件移动到不同的文件夹,使用文件标签搜索文件名。
文件:
文件夹:
运行脚本时,文件会进入各自的文件夹。
我必须使用文件标记(例如*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 " "
}
}
我不希望任何人给我答案。任何提示,或提示或一般指南指出我在正确的方向将非常感激。我在线搜索过,但大多数建议的答案对我来说太难理解了(大多数命令我还没有学过)。
答案 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"}
}
}