2013-09-11 4 views
2

Мой сценарий держит пристанет меня за исключением следующегоPowerShell: Copy-Item бросками DriveNotFoundException

copy-item : Cannot find drive. A drive with the name 'F' does not exist. 
At C:\Program Files (x86)\CA\ARCserve Backup\Templates\RB_Pre_Process.ps1:58 char:1 
+ copy-item -Path $drive -Destination $DST_DRIVE -Recurse -ErrorAction Stop 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (F:String) [Copy-Item], DriveNotFoundException 
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.CopyItemCommand 

Это то, что мой сценарий выглядит следующим образом. Я монтирую ISO-образ на диске F: и я добавил команду «start-slepp -s 5», поэтому я могу проверить, как монтируется изображение, и что он делает!

$BACKUP_PATH = "E:\00_BACKUP_DATA" 
$DR_PATH = "E:\01_DR_DATA" 
$ISO_IMAGE = "C:\Program Files (x86)\CA\ARCserve Backup\Templates\Winpe_x64.iso" 
$DST_DRIVE = "E:\" 

try { 
    New-EventLog -LogName Application -Source "RB_Pre_Process.ps1" -ErrorAction Stop 
} catch [System.InvalidOperationException] { 
    Write-host $_ 
} 

try { 
    Write-Host "Preparing RDX cartridge..." 

    # Query for disk object 
    $disk_number = (Get-Disk | Where-Object -Property FriendlyName -like "TANDBERG RDX*").Number 

    # Remove partitions 
    Get-Disk $disk_number | Clear-Disk -RemoveData -Confirm:$false | Out-Null 

    # Create new partition 
    New-Partition -DiskNumber $disk_number -UseMaximumSize | Out-Null 

    # Format partition 
    Format-Volume -DriveLetter E -FileSystem NTFS -NewFileSystemLabel "RDX_TAPE" -Confirm:$false | Out-Null 

    # Set partition as active 
    Set-Partition -DriveLetter E -IsActive:$true | Out-Null 
} catch { 
    Write-Host $_ 
    Write-EventLog -LogName Application -Source $MyInvocation.MyCommand.Name -EventID 2 -Message $_ 
} 

try { 
    Write-Host "Creating folder structure..." 

    new-item -itemtype directory -Path $BACKUP_PATH -ErrorAction stop | Out-Null 
    new-item -itemtype directory -path $DR_PATH -ErrorAction stop | Out-Null 
} catch { 
    Write-Host $_ 
    Write-EventLog -LogName Application -Source $MyInvocation.MyCommand.Name -EventID 2 -Message $_ 
} 

try { 
    Write-Host "Mounting ISO image..." 

    $image = Mount-DiskImage -ImagePath $ISO_IMAGE -PassThru -ErrorAction Stop 
} catch [ParameterBindingException] { 
    Write-Host $_ 
    Write-EventLog -LogName Application -Source $MyInvocation.MyCommand.Name -EventId 2 -Message $_ 
} 

$drive = ($image | Get-Volume).DriveLetter 
$drive += ":\*" 

Start-Sleep -s 5 

try { 
    Write-Host "Copying ISO content..." 

    copy-item -Path $drive -Destination $DST_DRIVE -Recurse -ErrorAction Stop 
} catch { 
    Write-Host $_ 
    Write-EventLog -LogName Application -Source $MyInvocation.MyCommand.Name -EventId 2 -Message $_ 
} 

try { 
    Write-Host "Unmounting ISO image..." 

    Dismount-DiskImage -ImagePath $ISO_IMAGE -ErrorAction Stop 
} catch [System.Exception] { 
    Write-Host $_ 
    Write-EventLog -LogName Application -Source $MyInvocation.MyCommand.Name -EventId 2 -Message $_ 
} 

Итак, что здесь не так? Иногда это иногда работает ...

ответ

4

Я «решил» проблему ... мой скрипт работает отлично, когда он запускается непосредственно из приглашения PowerShell вместо PowerShell ISE ... Таким образом, IDE является виновником.

+0

Рад, что нашел это. Были проблемы с устранением неполадок по нескольким функциям, над которыми я работаю. Интересно, что .NET вызывает работу без проблем. Пару часов в канализацию :(Так или иначе, как вы уже упоминали, никаких проблем в консольном хосте нет, поэтому теперь я могу либо использовать .NET, либо просто выполнить команду в новом процессе powershell. –

+0

Я провел целый вечер, выясняя это. вы! –

2

Кажется, что смонтированное изображение не может быть достигнуто в powershell. Я думаю, что это ограничение провайдера. Возможным обходным путем является выдача команды CMD. Вы можете заменить

copy-item -Path $drive -Destination $DST_DRIVE -Recurse -ErrorAction Stop 

с

& cmd /C "copy F:\* G:\dest\" 

Здесь я приведу пример, возможно, потребуется проделать дополнительную работу, чтобы скопировать recursively..you мог использовать xcopy или robocopy, которые могут обрабатывать рекурсивную копию.

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