Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] ошибка слишком длинный путь или имя файла (http://forum.oszone.net/showthread.php?t=297878)

firstarey 03-04-2015 13:44 2491380

ошибка слишком длинный путь или имя файла
 
Дано:
поиск файлов по маске и во вложенных папках
Код:

$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: слишком длинный путь или имя файла

Kazun 03-04-2015 13:48 2491382

Как вариант использовать robocopy , функция - http://www.powershellmagazine.com/20...ps-and-tricks/

firstarey 03-04-2015 13:57 2491387

при этом 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


Kazun 03-04-2015 13:59 2491388

Отрабатывает по причине использования более меньшего пути. Подключайте диск P и используйте в PowerShell.

Iska 03-04-2015 14:01 2491390

Цитата:

Цитата firstarey
как обойти ошибку »

Лучший вариант — найти и «ручками» сократить длинные пути и имена файлов. Конкретный ответ, в виде:
Цитата:

Цитата Kazun
Как вариант использовать robocopy , функция - http://www.powershellmagazine.com/20...ps-and-tricks/ »

, пользования коротких имён, net use, subst и пр. — будет зависеть от конечных целей.

firstarey 03-04-2015 14:05 2491394

Цитата:

Цитата Iska
будет зависеть от конечных целей. »

цели простые:
1. узнать количество определенных файлов и их размер ( ну например *.bak или любой другой)
2. удалить файлы по маске

Цитата:

Цитата Iska
net use »

а он в таком же виде в power shell переехал ?

Foreigner 03-04-2015 14:39 2491407

Цитата:

Цитата firstarey
а он в таком же виде в power shell переехал ? »

А что ему будет?
Подключите диск и путь будет короче:
Код:

new-psdrive -name z -psprovider 'filesystem' -root '\\serv\Otdely\ZUR'

Опиум 03-04-2015 14:42 2491409

robocopy...
да уж, как забудешь использовать ключ /ХJ
так потом не оберешься проблем с копированием appdata )

Iska 03-04-2015 16:03 2491421

Цитата:

Цитата firstarey
1. узнать количество определенных файлов и их размер ( ну например *.bak или любой другой)
2. удалить файлы по маске »

В первом случае можно просто использовать короткие имена. Во втором — нет.

В любом случае разбираться с длинными путями лучше «ручками».

Цитата:

Цитата firstarey
а он в таком же виде в power shell переехал ? »

«net.exe» — это обычная утилита командной строки. В PowerShell может использоваться так же, как и любая другая утилита.

firstarey 06-04-2015 09:34 2492225

в общем вышел из ситуации, как и ранее в 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 "закончили упражнения"


скриншот


Цитата:

Цитата Foreigner
Подключите диск »

вот еще бы указали сразу как отключить.
я конечно понимаю что это не сложно найти, но тому кто не знает значительно проще будет увидеть все в одном сообщении не ползая в справку.

Iska 06-04-2015 09:50 2492234

Цитата:

Цитата firstarey
вот еще бы указали сразу как отключить. »

«Remove-PSDrive».

Foreigner 06-04-2015 10:51 2492257

Цитата:

Цитата Iska
Remove-PSDrive »

Он сам отключится после выполнения скрипта (если не указан ключ -Persist), т.е. диск существует только на время сессии. Это сопоставимо с cmd:
Код:

pushd \\server\share

Iska 06-04-2015 21:11 2492479

Цитата:

Цитата Foreigner
(если не указан ключ -Persist) »

В старых версиях и параметра-то такого нет ;). Так что, там однозначно указано, что «на сессию». А «ежели хотите на постоянно» — то добавляйте команду в свой профиль.


Время: 21:24.

Время: 21:24.
© OSzone.net 2001-