Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Обработка путей превышающих 260 символов

Ответить
Настройки темы
PowerShell - Обработка путей превышающих 260 символов

Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Доброго времени суток.
Помогите пожалуйста допилить скрипт, для обработки путей больше 260 символов.

Код: Выделить весь код
$path = "c:\f1" 
$logfile = "C:\f1\log.txt" 
if (!(Test-Path $path)) {
  Write-Host "Folder not found" -ForegroundColor Red
  break
}
$folder_list = Get-ChildItem -Path $path -Recurse -Directory
foreach ($folder in $folder_list) {
  #$ACL = Get-Acl $folder.PSPath
  $ACL = Get-Acl $folder.FullName
  if ($ACL.AreAccessRulesProtected -ne $false) {
    $str = $folder.fullname
    Add-Content -Value $str -Path $logfile
  }
}
Вычитал что вроде как это решается монтированием. Попробовал на тестовом скрипте, но что-то он отказывается работать.

Код: Выделить весь код
Remove-PSDrive -Name X
$rootpath = "C:\test"
$logfile = "c:\test\log.txt"
try {
  $folder_list = Get-ChildItem $rootpath -Recurse -Directory -ErrorAction Stop
  foreach ($folder in $folder_list) {
    $folder.Name
    Write-Host "+++++++"
    $folder.FullName
    Write-Host "-------"
    $folder.PSPath
    Write-Host "========================="
    ($folder.PSPath).Length
    Write-Host "\\\\\\\\\\\"
  }
}
catch {
  Write-Host "ERROR"
  $folder.FullName
  ($folder.FullName).Length
  $newrootfolder = New-PSDrive -Name X -PSProvider FileSystem -Root $folder.FullName
  Get-ChildItem $newrootfolder 
}
И в последней строке Get-ChildItem $newrootfolder скрипт вываливается в ошибку длинного пути.
Подскажите пожалуйста, в чём может быть проблема?

Отправлено: 21:27, 08-12-2015

 

Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


На удивление, ни один из вариантов, как оказалось, не заработал с UNC и DFS путями ((
Как сказал всем известный поисковик, subinacl вообще не понимает dfs.
SetACL понимает и UNC и DFS, но вывод получается примерно такой:
Цитата:
folders[0]: DACL(protected):
folders[6]: DACL(not_protected):
Подскажите, как подправить скрипты, пожалуйста, пока сам в ключах утилиты не разобрался..

Отправлено: 16:12, 29-12-2015 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Качаем модуль - https://gallery.technet.microsoft.co...f-90dbb2b84e85

Код: Выделить весь код
Get-ChildItem2 -Path $folder  -Recurse -Directory | Where {!(Get-NTFSInheritance $_).AccessInheritanceEnabled} | Select -ExpandProperty FullName
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:33, 30-12-2015 | #12


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Kazun,
Большое спасибо за все ответы в теме!
Интересный модуль, изучим-с) Странно, что во время поиска не наткнулся на него.
В попытках завести один из предложенных Вами вариантов выше, заработал тот, что использует subinacl, ниже рабочий вариант с unc.

Код: Выделить весь код
cls
$subinacl = "C:\temp\subinacl.exe" #путь до улититы subinacl.exe
$log = "c:\temp\log.txt" #путь до лог файла
$log_subinacl = "c:\temp\log_subinacl.txt" #путь до внутреннего лог файла subinacl
$path = "\\uncpath...\*" #корневая папка для поиска

& $subinacl /outputlog=$log_subinacl /subdirectories=directories $path #запуск subinacl в фоне, с записью инфы в лог 
$content = (Get-Content $log_subinacl) -match "(\+File|\/control)" #выбираем из файла строки по условию

$result = for($i=0; $i -le $content.Count; $i+=2) {
    $status = $content[$i+1] -match "SE_DACL_PROTECTED" #если в строке, есть подстрока, записываем в переменную
    if($status) {
        $content[$i].TrimStart("+File ") #удаляем указанную подстроку из строки
    }
}

Remove-Item $log_subinacl #удаляем лог subinacl
$result | Out-File $log #записываем результат в переменную
На win10 работал подобный вариант написанный Вами ранее, но на win serv 2012r2 регулярное выражение должно выглядеть так - (\+File|\/control).
P.S. Но приведённый Вами модуль, мне нравится большей, этих костыльных решений )

Последний раз редактировалось pogo, 30-12-2015 в 14:42.


Отправлено: 14:31, 30-12-2015 | #13



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Обработка путей превышающих 260 символов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Загрузка - Subst и запоминание последних путей Mancoffee Microsoft Windows 7 9 31-05-2017 23:17
CMD/BAT - Обработка более 1028 символов в переменной worship Скриптовые языки администрирования Windows 4 27-02-2015 13:34
CMD/BAT - [решено] Создать список путей gen0m.rsw Скриптовые языки администрирования Windows 7 08-09-2010 02:55
PHP и XML | Обработка неалфавитных символов Coutty Вебмастеру 6 17-12-2008 10:42
mc - запоминание путей Аlchemist Программное обеспечение Linux и FreeBSD 1 10-09-2008 12:06




 
Переход