ошибка слишком длинный путь или имя файла
Дано:
поиск файлов по маске и во вложенных папках
Код:
$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: слишком длинный путь или имя файла
|
при этом 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.
|
Лучший вариант — найти и «ручками» сократить длинные пути и имена файлов. Конкретный ответ, в виде:
, пользования коротких имён, net use, subst и пр. — будет зависеть от конечных целей.
|
Цитата:
Цитата Iska
будет зависеть от конечных целей. »
|
цели простые:
1. узнать количество определенных файлов и их размер ( ну например *.bak или любой другой)
2. удалить файлы по маске
а он в таком же виде в power shell переехал ?
|
Цитата:
Цитата firstarey
а он в таком же виде в power shell переехал ? »
|
А что ему будет?
Подключите диск и путь будет короче:
Код:
new-psdrive -name z -psprovider 'filesystem' -root '\\serv\Otdely\ZUR'
|
robocopy...
да уж, как забудешь использовать ключ /ХJ
так потом не оберешься проблем с копированием appdata )
|
Цитата:
Цитата firstarey
1. узнать количество определенных файлов и их размер ( ну например *.bak или любой другой)
2. удалить файлы по маске »
|
В первом случае можно просто использовать короткие имена. Во втором — нет.
В любом случае разбираться с длинными путями лучше «ручками».
Цитата:
Цитата firstarey
а он в таком же виде в power shell переехал ? »
|
«net.exe» — это обычная утилита командной строки. В PowerShell может использоваться так же, как и любая другая утилита.
|
в общем вышел из ситуации, как и ранее в 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 "закончили упражнения"
вот еще бы указали сразу как отключить.
я конечно понимаю что это не сложно найти, но тому кто не знает значительно проще будет увидеть все в одном сообщении не ползая в справку.
|
Цитата:
Цитата firstarey
вот еще бы указали сразу как отключить. »
|
«Remove-PSDrive».
|
Он сам отключится после выполнения скрипта (если не указан ключ -Persist), т.е. диск существует только на время сессии. Это сопоставимо с cmd:
Код:
pushd \\server\share
|
Цитата:
Цитата Foreigner
(если не указан ключ -Persist) »
|
В старых версиях и параметра-то такого нет ;). Так что, там однозначно указано, что «на сессию». А «ежели хотите на постоянно» — то добавляйте команду в свой профиль.
|
Время: 21:24.
© OSzone.net 2001-