使用ForEach&Switch将Copy文件夹文件移动到Work对应子文件夹的路径问题
嘿,这个路径问题我在PowerShell脚本里碰过好多次——其实核心就是要确保脚本能精准找到文件的位置,不管当前工作目录在哪。咱们分两种情况来解决,其中一种就是你问到的用Set-Location的方式:
方法1:用Set-Location切换到根目录
如果一定要用Set-Location,关键是要先切换到包含Copy和Work文件夹的那个根目录,这样后续的相对路径就会基于这个目录生效。推荐用$PSScriptRoot来定位根目录,它会指向你的脚本所在的文件夹,比直接用.更可靠(毕竟如果用户从其他目录运行脚本,.会指向当前运行目录,容易出错)。
# 切换到包含Copy和Work的根目录(脚本所在目录) Set-Location -Path $PSScriptRoot # 抓取Copy文件夹内的所有文件到数组 $copyFiles = Get-ChildItem -Path .\Copy\* -File # 遍历每个文件,匹配对应的目标文件夹 foreach ($file in $copyFiles) { # 根据文件名前缀匹配目标路径 switch -Wildcard ($file.Name) { "Lab*" { $targetFolder = ".\Work\Labs\" } "Assignment*" { $targetFolder = ".\Work\Assignments\" } "Lecture*" { $targetFolder = ".\Work\Lectures\" } "Script*" { $targetFolder = ".\Work\Scripts\" } default { Write-Warning "找不到文件 $($file.Name) 的匹配文件夹,跳过" continue } } # 移动文件,-Force可以覆盖同名文件(不需要的话可以去掉) Move-Item -Path $file.FullName -Destination $targetFolder -Force }
方法2:更稳妥的“不切换目录”方案(推荐)
其实切换目录有时候会带来额外问题——比如脚本后续如果还有其他操作,可能会因为工作目录变化而出错。更稳妥的方式是直接用绝对路径来定位所有文件和文件夹,完全不需要切换目录:
# 定义根目录(脚本所在的包含Copy和Work的文件夹) $rootDir = $PSScriptRoot # 用绝对路径抓取Copy里的文件 $copyFiles = Get-ChildItem -Path (Join-Path -Path $rootDir -ChildPath "Copy") -File foreach ($file in $copyFiles) { # 拼接目标文件夹的绝对路径 switch -Wildcard ($file.Name) { "Lab*" { $targetFolder = Join-Path -Path $rootDir -ChildPath "Work\Labs" } "Assignment*" { $targetFolder = Join-Path -Path $rootDir -ChildPath "Work\Assignments" } "Lecture*" { $targetFolder = Join-Path -Path $rootDir -ChildPath "Work\Lectures" } "Script*" { $targetFolder = Join-Path -Path $rootDir -ChildPath "Work\Scripts" } default { Write-Warning "找不到文件 $($file.Name) 的匹配文件夹,跳过" continue } } # 移动文件,全程用绝对路径,不会出错 Move-Item -Path $file.FullName -Destination $targetFolder -Force }
几个小提示
- 用
-File参数确保只抓取文件,不会误抓到Copy里的子文件夹 - 如果你的文件名匹配规则更精细(比如
Lab12要严格匹配数字后缀),可以把switch -Wildcard改成switch -Regex,用正则表达式来匹配 -Force参数可以覆盖目标文件夹里的同名文件,如果不需要覆盖,直接去掉这个参数就行
内容的提问来源于stack exchange,提问作者PotatoUser
相关产品推荐
相关产品推荐

