Показать полную графическую версию : [решено] ошибка слишком длинный путь или имя файла
firstarey
03-04-2015, 13:44
Дано:
поиск файлов по маске и во вложенных папках
$PathIn = "\\serv\Otdely\ZUR"
$MaskDel = "*.bak"
$FilesDel = Get-ChildItem $PathIn\* -recurse -Include $MaskDel
if ($FilesDel -ne $null) {
Write-Host "нашлось"`t ($FilesDel.count)
Write-Host "нашлось"`t ($FilesDel.Length / 1Mb) "Мб"
Write-Host "нашлось"`t ($FilesDel.Length / 1Gb) "Гб"
ForEach ($FileDelCurrent in $FilesDel) {
$FileDelCurrent_count++
Write-Host $FileDelCurrent_count ($FileDelCurrent.Length / 1Mb) `t $FileDelCurrent.name
}
}
read-host "закончили упражнения"
Вопрос:
как обойти ошибку
Get-ChildItem: слишком длинный путь или имя файла
Как вариант использовать robocopy , функция - http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/
firstarey
03-04-2015, 13:57
при этом bat вариант отрабатывает без ошибок:
@title [ERASE]
@echo off
Color 0e
rem ********************************************************************************
rem * скрипт удаления файлов по маске. *
rem ********************************************************************************
rem set PUT=\\serv\Otdely\ZUR\ПРОЕКТЫ\
rem откуда удаляем:
set PUT=\\serv\Otdely\ZUR\ЏђЋ…Љ’›
set DEL_LOG=\\serv\Otdely\ZUR\ЏђЋ…Љ’›\г¤*«Ґ*ЁҐ bak.txt
set end_error=0
echo ==[%date:~6,4%-%date:~3,2%-%date:~0,2%]==[%time%]==[%username%]=======[Начнем]====================== >>"%DEL_LOG%"
rem подключим сетевой диск:
NET USE P: "%PUT%"
if %errorlevel% NEQ 0 (
set end_error=1
set text_EE=не удалось подключить сетевой диск
goto :end
)
echo Создаем сетевой диск: OK >>"%DEL_LOG%"
chcp 1251>nul
rem приступим к удалению:
Del /F /S /Q P:\*.bak >>"%DEL_LOG%"
chcp 866>nul
:end
NET USE P: /delete /y
if %end_error% EQU 0 echo ==[%date:~6,4%-%date:~3,2%-%date:~0,2%]==[%time%]==[%username%]=======[Выполнено]=================== >>"%DEL_LOG%"
if %end_error% EQU 1 echo ==[%date:~6,4%-%date:~3,2%-%date:~0,2%]==[%time%]==[%username%]=======[ОШИБКА: %text_EE%]== >>"%DEL_LOG%"
echo. >>"%DEL_LOG%"
ping -n 5 localhost>nul
exit
pause
Отрабатывает по причине использования более меньшего пути. Подключайте диск P и используйте в PowerShell.
как обойти ошибку »
Лучший вариант — найти и «ручками» сократить длинные пути и имена файлов. Конкретный ответ, в виде:
Как вариант использовать robocopy , функция - http://www.powershellmagazine.com/20...ps-and-tricks/ »
, пользования коротких имён, net use, subst и пр. — будет зависеть от конечных целей.
firstarey
03-04-2015, 14:05
будет зависеть от конечных целей. »
цели простые:
1. узнать количество определенных файлов и их размер ( ну например *.bak или любой другой)
2. удалить файлы по маске
net use »
а он в таком же виде в power shell переехал ?
Foreigner
03-04-2015, 14:39
а он в таком же виде в power shell переехал ? »
А что ему будет?
Подключите диск и путь будет короче:
new-psdrive -name z -psprovider 'filesystem' -root '\\serv\Otdely\ZUR'
robocopy...
да уж, как забудешь использовать ключ /ХJ
так потом не оберешься проблем с копированием appdata )
1. узнать количество определенных файлов и их размер ( ну например *.bak или любой другой)
2. удалить файлы по маске »
В первом случае можно просто использовать короткие имена. Во втором — нет.
В любом случае разбираться с длинными путями лучше «ручками».
а он в таком же виде в power shell переехал ? »
«net.exe» — это обычная утилита командной строки. В PowerShell может использоваться так же, как и любая другая утилита.
firstarey
06-04-2015, 09:34
в общем вышел из ситуации, как и ранее в bat файле, через подключение сетевого диска.
если кому интересно - пользуйтесь:
$PathIn = "\\serv\Otdely\ZUR\ПРОЕКТЫ"
$MaskDel = "*.bak"
#########################################
Write-Host "работаем.."
$MinWork=((Measure-Command {
NET USE P: "$PathIn"
$FilesDel = Get-ChildItem P:\* -recurse -Include $MaskDel
if ($FilesDel -ne $null) {
Clear-Host
ForEach ($FileDelCurrent in $FilesDel) {
$FileDelCurrent_count++
$Files_Length = $Files_Length + $($FileDelCurrent.Length / 1Mb)
[string]$DocNum = $FileDelCurrent
$DocNum = $DocNum.split("\")[2]
$DocNum = $DocNum.split("_")[0]
Switch (($(($FileDelCurrent.Length / 1Mb).tostring("F00"))).Length) {
1 {$FileDelCurrent_Length = "00$(($FileDelCurrent.Length / 1Mb).tostring("F00"))"}
2 {$FileDelCurrent_Length = "0$(($FileDelCurrent.Length / 1Mb).tostring("F00"))"}
3 {$FileDelCurrent_Length = "$(($FileDelCurrent.Length / 1Mb).tostring("F00"))"}
}
Write-Host $FileDelCurrent_count`t$FileDelCurrent_Length "Мб"`t$DocNum`t$($FileDelCurrent.name)
}
}
NET USE P: /delete /y
}).TotalMinutes.tostring("F00"))
Write-Host "-------------------------------------------------------------------------------"
Write-Host "работал "$MinWork" мин, нашлось "($FilesDel.count)" файлов, размером "($Files_Length).tostring("F00")" Мб"
Write-Host "-------------------------------------------------------------------------------"
$WinTitle=(get-host).UI.RawUI
$WinTitle.WindowTitle="готово!"
read-host "закончили упражнения"
http://rghost.ru/8z587HBNh/image.png (http://rghost.ru/8z587HBNh.view)
Подключите диск »
вот еще бы указали сразу как отключить.
я конечно понимаю что это не сложно найти, но тому кто не знает значительно проще будет увидеть все в одном сообщении не ползая в справку.
вот еще бы указали сразу как отключить. »
«Remove-PSDrive».
Foreigner
06-04-2015, 10:51
Remove-PSDrive »
Он сам отключится после выполнения скрипта (если не указан ключ -Persist), т.е. диск существует только на время сессии. Это сопоставимо с cmd:
pushd \\server\share
(если не указан ключ -Persist) »
В старых версиях и параметра-то такого нет ;). Так что, там однозначно указано, что «на сессию». А «ежели хотите на постоянно» — то добавляйте команду в свой профиль.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.