其中文件名为:姓名+短横线+其他
先给出所有的代码:
# 遍历所有以姓名为前缀的文件,并创建相应的文件夹,并将文件移动到对应的文件夹中
Get-ChildItem | Where-Object {$_.Name -match "^[\w\s]+-.*\..+$"} | ForEach-Object {
# 从文件名中提取出姓名和扩展名
$name = [regex]::Match([System.IO.Path]::GetFileNameWithoutExtension($_.Name), "^[\w\s]+").Value.Trim()
$extension = [System.IO.Path]::GetExtension($_.Name)
# 创建相应的文件夹
if (!(Test-Path $name)) {
New-Item -ItemType Directory -Name $name
}
# 判断文件名前缀是否与文件夹名称相同,若相同则将文件移动到对应的文件夹中
if ($_.Name.StartsWith("$name-")) {
Move-Item $_.FullName "$name\$($_.Name)"
}
}
Write-Host "Done."
以下是 PowerShell 脚本的详细解释:
遍历文件
Get-ChildItem | Where-Object {$_.Name -match "^[\w\s]+-.*\..+$"} | ForEach-Object {
#...
}
这段代码使用 Get-ChildItem
命令获取当前目录下的所有文件,然后使用 Where-Object
条件过滤器,筛选出文件名以姓名为前缀的文件。这里使用的正则表达式 ^[\w\s]+-.*\..+$
匹配文件名,表示以一个或多个字母、数字或空格开头,紧接着一个短横线,然后是任意字符直到文件扩展名为止。
随后使用 ForEach-Object
命令对满足条件的文件进行处理。
提取姓名和扩展名
$name = [regex]::Match([System.IO.Path]::GetFileNameWithoutExtension($_.Name), "^[\w\s]+").Value.Trim()
$extension = [System.IO.Path]::GetExtension($_.Name)
这段代码从文件名中提取出姓名和扩展名,用于之后创建文件夹和移动文件。
GetFileNameWithoutExtension($_.Name)
获取文件名(不包含扩展名)[regex]::Match(…, "^[\w\s]+").Value.Trim()
提取姓名部分,使用的是正则表达式^[\w\s]+
,匹配一个或多个字母、数字或空格,表示姓名部分。同时使用Trim()
方法删除姓名前后的空格。GetExtension($_.Name)
获取文件的扩展名,如.txt
、.pdf
等。
创建文件夹
if (!(Test-Path $name)) {
New-Item -ItemType Directory -Name $name
}
这段代码使用 Test-Path
命令判断当前目录下是否已经存在以该姓名为名称的文件夹,若不存在则使用 New-Item
创建新的文件夹。需要注意的是,在 PowerShell 脚本中,如果要创建新的文件夹,需要使用 -ItemType Directory
选项。
移动文件
if ($_.Name.StartsWith("$name-")) {
Move-Item $_.FullName "$name\$($_.Name)"
}
这段代码判断文件名前缀是否与文件夹名称相同,如果相同,则使用 Move-Item
命令将文件移动到对应的文件夹中,并将文件名中的前缀一起放入文件夹。需要注意的是,这里使用了 $_.FullName
来获取文件的完整路径,以便于使用 Move-Item
命令移动文件,同时使用 $($_.Name)
的方式在文件名中插入姓名前缀。
最后,整个脚本的输出为 Done.
,表示处理完成。
将其保存为.ps1的文件,在powershell中运行:
./xxx.ps1
记得以管理员身份打开powershell!!
如果系统阻止运行ps脚本,那就设置一下:
Set-ExecutionPolicy Unrestricted
就酱紫。