2014-12-16 3 views
4

Я использую сценарий оболочки питания для копирования некоторых файлов с моего компьютера на USB-накопитель. Однако, несмотря на то, что я улавливаю исключение System.IO, я все еще получаю ошибку внизу. Как я правильно поймаю это исключение, поэтому он показывает сообщение в моем блоке Catch.Powershell Try Catch IOException DirectoryExist

CLS 

$parentDirectory="C:\Users\someUser" 
$userDirectory="someUserDirectory" 
$copyDrive="E:" 
$folderName="Downloads" 
$date = Get-Date 
$dateDay=$date.Day 
$dateMonth=$date.Month 
$dateYear=$date.Year 
$folderDate=$dateDay.ToString()+"-"+$dateMonth.ToString()+"-"+$dateYear.ToString(); 


Try{ 
    New-Item -Path $copyDrive\$folderDate -ItemType directory 
    Copy-Item $parentDirectory\$userDirectory\$folderName\* $copyDrive\$folderDate 
    } 
Catch [System.IO] 
{ 
    WriteOutput "Directory Exists Already" 
} 


New-Item : Item with specified name E:\16-12-2014 already exists. 
At C:\Users\someUser\Desktop\checkexist.ps1:15 char:9 
+   New-Item -Path $copyDrive\$folderDate -ItemType directory 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ResourceExists: (E:\16-12-2014:String) [New-Item], IOException 
    + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand 

ответ

0

Я не предлагаю на самом деле поймать ошибку в этом случае. Несмотря на то, что может быть правильное действие в целом, в данном конкретном случае я хотел бы сделать следующее:

$newFolder = "$copyDrive\$folderDate" 

if (-not (Test-Path $newFolder)) { 
    New-Item -Path $newFolder -ItemType directory 
    Copy-Item $parentDirectory\$userDirectory\$folderName\* $newFolder 
} else { 
    Write-Output "Directory Exists Already" 
} 
+1

Это не атомное! Возможно, папка создается между тестовым путем и созданием. –

0

Если добавить -ErrorAction Stop к линии создания каталога вы можете поймать [System.IO.IOException] (не [System.IO]). Вы также должны поймать все другие исключения, которые потенциально могут возникнуть:

try { 
    New-Item -Path $copyDrive\$folderDate -ItemType directory -ErrorAction Stop 
    Copy-Item $parentDirectory\$userDirectory\$folderName\* $copyDrive\$folderDate -ErrorAction Stop 
} 

catch [System.IO.IOException] { 
    WriteOutput $_.Exception.Message 
} 

catch { 
    #some other error 
} 
1

Если вы хотите, чтобы поймать исключение для New-Item вызова, вам нужно сделать две вещи:

  1. Установите $ErrorActionPreference = "Stop" по по умолчанию его значение равно Continue. Это сделает скрипт Stop в случае исключений.

  2. Trap правильное исключение и/или все из них

, если вы хотите, чтобы ловушка все исключения, просто используйте catch без аргументов:

catch 
{ 
    Write-Output "Directory Exists Already" 
} 

если вы хотите, чтобы улавливать специфические исключение, сначала выясните, какой из них, проверив значение

$error[0].Exception.GetType().FullName 

и в вашем случае значение:

System.IO.IOException 

, то вы можете использовать это значение в качестве аргумента в свой улов, как этот:

catch [System.IO.IOException] 
{ 
    Write-Output "Directory Exists Already" 
} 

Источник стоит читать: An introduction to Error Handling in Powershell

Смежные вопросы