到目前为止,这是我的代码:
$Folders = Get-ChildItem -Path U:\Powershell\Move-Files\Clients |
?{$_.PsIsContainer} |
Select -ExpandProperty FullName
Get-ChildItem -Path U:\Powershell\Move-Files\Individual | ?{
!($_.PsIsContainer)
} | %{
#Part of the file to match
$File = ($_.name.substring(0,$_.basename.length-11))
$File = ($File -split '_')[1] + ", " + ($File -split '_')[0]
# Find matching Directory
$Path = $Folders | ?{$_ -match $File}
Move-Item -Path $_.FullName -Destination $Path -ErrorAction Silently Continue
Write-Host "Moved $_.FullName to $Path"
}
基本上,我有很多名为First_Last (MMM yyyy).pdf
的文件,这会占用每个文件,并以Last, First
的格式创建变量,以便它可以进行部分匹配并将文件移动到目标文件夹(格式为Last, First ##-####
)。这一切都很好,除了我在实现try/catch
错误处理方面遇到了麻烦。
我将以Move-Item
开头的行替换为:
try {
Move-Item -Path $_.FullName -Destination $Path -ErrorAction SilentlyContinue
"Moved $_.FullName to $Path successfully" | Add-Content U:\Powershell\Move-Files\log.txt
} catch {
"Error moving $_.FullName" | add-content U:\Powershell\Move-Files\log.txt
}
它几乎完美地 ,但catch
没有正确报告哪些文件未被移动。 try
部分在日志中读出正常。但catch
只会在日志中阅读以下内容:
移动错误无法处理参数,因为参数" destination"的值一片空白。更改参数" destination"的值到非null值.FullName
不确定如何修复它。
答案 0 :(得分:4)
$_
块中的当前对象(catch
)是错误/异常,而不是引发异常的操作中的当前对象。如果要在错误消息中输出路径,则需要将其放在变量中:
try {
$file = $_.FullName
Move-Item -Path $file -Destination $Path -ErrorAction SilentlyContinue
"Moved $file to $Path successfully" | Add-Content 'U:\Powershell\Move-Files\log.txt'
} catch {
"Error moving $file" | Add-Content 'U:\Powershell\Move-Files\log.txt'
}
作为旁注:PowerShell只对字符串进行简单的变量扩展。 "$_.FullName"
将扩展为$_
的字符串表示形式,后跟字符串".FullName"
。如果要扩展当前对象的属性,则需要子表达式:
"Error moving $($_.FullName)"
字符串连接:
"Error moving " + $_.FullName
或格式运算符:
"Error moving {0}" -f $_.FullName