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

Компьютерный форум 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

 

Ветеран


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

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


Утилита SetAcl не имеет таких ограничений:

Код: Выделить весь код
$folders = SetACL.exe -on "C:\f1" -ot file -actn list -rec cont | Where {$_ -match "(:\\|DACL\()"}

$log = for($i =0 ; $i -le $folders.count;$i+=2) {
	$status = $folders[($i+1)] -notmatch "not_protected"
	if($status)
	{
		$folders[$i]
	}
}
$log | Out-File $logfile
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:10, 09-12-2015 | #2



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

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


Забанен


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

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


Kazun, вроде бы тот же robocopy умеет работать с путями в более 260 символов, да и трюк с dir тоже прокатывает, например:
Код: Выделить весь код
PS E:\sandbox> cmd /c dir \\e:\test /s /b | findstr ...
Что-то в этом роде. Но, если не хочется использовать консоль в хосте, можно попытать счастья со сторонними библиотеками, вроде AlphaFS и QuickIO, - обе с открытым исходным кодом. Ну и наконец можно поробовать использовать методы GetFiles() и GetDirectories из типа System.IO.Directory.

Отправлено: 13:23, 09-12-2015 | #3


Старожил


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

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


Спасибо за ответы.

Kazun,
Приведённый Вами скрипт не работает
второй строгой добавил
Код: Выделить весь код
write-host folders: $folders
что бы посмотреть что утилита получает, и после вывода ошибка.

Цитата:
folders:
Cannot index into a null array.
At line:6 char:2
+ $status = $folders[($i+1)] -notmatch "not_protected"
....
greg zakharov,
robocopy может и умеет, но она ничего не знает о правах и их наследованиях.
Как показано в первом посте, я попробовал обрезать пути, методом монтирования диска, как пишут в google, но у меня это не работает..

Отправлено: 13:40, 09-12-2015 | #4


Ветеран


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

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


Какой результат вывода?
Код: Выделить весь код
SetACL.exe -on "C:\f1" -ot file -actn list -rec cont
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:03, 09-12-2015 | #5


Старожил


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

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


C:\test> .\SetACL.exe -on "C:\test" -ot file -actn list -rec cont
Цитата:
C:\test\very_bif_test_folder_001\very_bif_test_folder_002\very_bif_test_folder_003\very_bif_test_fol der_004

DACL(protected+auto_inherited):
SYSTEM full allow container_inherit+object_inherit
Administrators full allow container_inherit+object_inherit
Users read_execute allow container_inherit+object_inherit
Users FILE_ADD_FILE+FILE_ADD_SUBDIRECTORY allow container_inherit
CREATOR OWNER full allow container_inherit+object_inherit+inherit_only


SetACL finished successfully.

Отправлено: 14:37, 09-12-2015 | #6


Старожил


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

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


Kazun,

Прошу прощения.
По ходе дела я где-то в путях накосячил, из-за этого не работало.
Вот рабочий вариант

Код: Выделить весь код
$logfile = "C:\test\log.txt"
$folders = C:\test\SetACL.exe -on "C:\test" -ot file -actn list -rec cont | Where {$_ -match "(:\\|DACL\()"}

#write-host folders: $folders

$log = for($i=0 ; $i -le $folders.count; $i+=2) {
	$status = $folders[($i+1)] -notmatch "not_protected"
	if($status)
	{
		$folders[$i]
	}
}

$log | Out-File $logfile
Большое спасибо!!

Отправлено: 14:57, 09-12-2015 | #7


Старожил


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

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


Подскажите, а можно сделать тоже самое, но средствами утилиты от MS - SubInACL?

Отправлено: 09:10, 10-12-2015 | #8


Ветеран


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

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


Код: Выделить весь код
$subinacl = "C:\Program Files (x86)\Windows Resource Kits\Tools\subinacl.exe"
$logname = "C:\log.txt"
$folder = "C:\f1"

& $subinacl /outputlog=$logname /subdirectories=directories $folder
$folders = (Get-Content $logname) -match "(\+File|/control)"

$log = for($i=0 ; $i -le $folders.count; $i+=2) {
	$status = $folders[($i+1)] -match "SE_DACL_PROTECTED"
	if($status)
	{
		$folders[$i].TrimStart("+File ")
	}
}
$log | Out-File $logfile
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:44, 10-12-2015 | #9


Старожил


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

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


Kazun, спасибо за оперативный ответ!
Скрипт отрабатывает без ошибок, но лог файл пустой.

P.S. Вроде как проблему решил, указав такой путь
Код: Выделить весь код
$folder = "C:\f1\*"

Отправлено: 10:01, 10-12-2015 | #10



Компьютерный форум 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




 
Переход