我完全是新手,尝试过各种教程和指南以及 ChatGPT 帮助来解决这个问题,但都无济于事。我的目标是重新组织本地下载的有声读物库,方法是使用作者姓名创建一个新目录,然后将该作者的有声读物目录复制到该新目录中作为新子目录。
例子
当前目录路径 =
E:\scripttest\Adrian Tchaikovsky - Walking to Aldebaran, Narrated by Adrian Tchaikovsky [1630154431]
新目录路径 =
E:\scripttest\Adrian Tchaikovsky\Walking to Aldebaran, Narrated by Adrian Tchaikovsky [1630154431]
到目前为止,我已经能够隔离作者的姓名,创建新目录并成功创建一个名称正确的新子目录。
- 该脚本检查作者目录是否存在,并通过抓取“-”之前的文本来创建新的作者目录(如有必要)
- 然后,它抓取“-”后面的所有内容,创建一个包含书名的新子目录
- 它应该将内容从原始目录移动到新的书名子目录
- 一旦我让移动工作正常进行,我打算添加确认所有文件都已成功移动,然后删除源目录
不幸的是,源目录中的内容都不存在。Powershell 没有返回任何错误,脚本似乎已成功完成。源目录包括这些文件类型 - *.ico、*.m4b 和 *.jpg。我希望批量复制文件,而不是指定要复制的每种文件类型,以使其保持简单。
到目前为止的脚本:
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated) {
# tried to elevate, did not work, aborting
} else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}
'running with full privileges'
$mainDir = "E:\scripttest"
$directories = Get-ChildItem -Path $mainDir | Where-Object { $_.PSIsContainer }
foreach ($dir in $directories) {
# Extract the author's name and the remaining part of the directory name
if ($dir.Name -match "^(.*?) - (.*)$") {
$author = $matches[1]
$title = $matches[2]
$authorDir = Join-Path -Path $mainDir -ChildPath $author
if (-not (Test-Path -Path $authorDir)) {
New-Item -Path $authorDir -ItemType Directory
}
$newSubDir = Join-Path -Path $authorDir -ChildPath $title
New-Item -Path $newSubDir -ItemType Directory
Get-ChildItem -Path $dir.FullName | ForEach-Object {
Move-Item -Path $_.FullName -Destination $newSubDir -Force
}
}
}
Theo给出了关键提示:
提供程序cmdlet的
-Path
( )参数(第一个位置参数隐式绑定到该参数)需要通配符表达式。-FilePath
因为 PowerShell 的通配符语言还支持诸如
[a-z]
(匹配任何英文字母)之类的表达式,所以如果路径恰好包含字符,则原本应该是文字的[
路径会被误解。要传递这样的文字(逐字)路径,请明确使用
-LiteralPath
参数。或者,将文件信息对象(例如
Get-ChildItem
通过管道生成的)传递给提供程序 cmdlet,该 cmdlet 也绑定到-LiteralPath
欲了解更多信息,请参阅此答案。
此外,使用
-Force
带有的开关来确保按需创建目录路径New-Item
-ItemType Directory
更加简单,从而无需进行调用Test-Path
。-Force
如果需要,则创建指定目录路径的任何缺失组件,如果路径已完整存在,则不采取任何措施。[System.IO.DirectoryInfo]
都会输出描述新创建或预先存在的目录的实例。将所有内容放在您的代码上下文中,并应用额外的优化:
笔记:
New-Item
,-Path
使用参数,其有效功能类似于-LiteralPath
(该cmdlet 在技术上不支持)。