ForEach with Try / Catch Error Handling

时间:2017-05-11 14:58:12

标签: powershell try-catch

到目前为止,这是我的代码:

$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

不确定如何修复它。

1 个答案:

答案 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