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

Dragokas 18-12-2011 21:50 1817583

Украинская "і" и скрытые файлы
 
Как произвести действие (например attrib -r -s -h) над всеми файлами и папками, которые имеют любой из таких атрибутов: скрытый, системный, только для чтения. Среди них есть папки и файлы с украинской буквой і.

Пробовал код:
Код:

for /f "delims=" %%a in ('dir /b /a *.*') do (attrib -s -h -r "%%~sna" >nul)
но он работает только с папками, да и без проверки атрибутов.
А когда я ввожу ключ /ashr, выдается все, что имеет все эти атрибуты одновременно, файлы имеющие только один из этих атрибутов опускаются.

2) Объясните, пожалуйста, что такое ~sn ?
и каким образом "істина" и "6C78~1", получаемое этим ключем, означают одну и ту же папку (что это за вариант 8.3 стандарта) ?

Iska 18-12-2011 22:54 1817637

Цитата:

Цитата Diskretor
2) Объясните, пожалуйста, что такое ~sn ? »

Будут использоваться короткие имена в пути к файлу. Об этом явно сказано в:
Код:

for /?
Цитата:

Цитата Diskretor
и каким образом "істина" и "6C78~1", получаемое этим ключем, означают одну и ту же папку »

В Вашем конкретном случае «6C78~1» представляет собой короткое имя для записи «істина» (8.3 filename, Long filename, NTFS: 3.3 Hard links and short filenames).

Цитата:

Цитата Diskretor
что это за вариант 8.3 стандарта »

Самый обычный вариант. По-русски, принципы формирования коротких имён для разных файловых систем, поддерживаемых ОС Windows, Вы можете посмотреть, например, здесь: 1. Концепции Windows NT: 1.5.3. Короткие имена.

Dragokas 19-12-2011 01:43 1817705

Спасибо, почитаю. Остается вопрос: как совместить эти 6 команд в одну:
Код:

for /f "delims=" %%a in ('dir /b /asd') do (attrib -s -h -r "%%~sna" >nul)
for /f "delims=" %%a in ('dir /b /ahd') do (attrib -s -h -r "%%~sna" >nul)
for /f "delims=" %%a in ('dir /b /ard') do (attrib -s -h -r "%%~sna" >nul)
for /f "delims=" %%a in ('dir /b /as') do (attrib -s -h -r "%%a" >nul)
for /f "delims=" %%a in ('dir /b /ah') do (attrib -s -h -r "%%a" >nul)
for /f "delims=" %%a in ('dir /b /ar') do (attrib -s -h -r "%%a" >nul)


Iska 19-12-2011 04:05 1817730

1. А есть ли какой-либо смысл делать отбор по атрибутам, коль Вы их и так сбрасываете? Просто снимайте эти атрибуты для всех папок/файлов, только и всего.
2. Мне не понятны эти игры с короткими именами. У меня «attrib.exe» отработал с приведённым Вами выше именем «істина» без каких-либо проблем.

Dragokas 19-12-2011 12:15 1817871

Цитата:

Цитата Iska
1. А есть ли какой-либо смысл делать отбор по атрибутам, коль Вы их и так сбрасываете? Просто снимайте эти атрибуты для всех папок/файлов, только и всего. »

Да, есть смысл. Чтобы сократить время, расходуемое на изменение атрибутов (при огромном количестве папок и файлов, да еще и при включенном антивируснике - набор постоянно разный). Мне важно максимальное быстродействие. Приведенные 6 команд справляются на ура, но хотелось бы как-то лаконичней что-ли.

Цитата:

Цитата Diskretor
2. Мне не понятны эти игры с короткими именами. У меня «attrib.exe» отработал с приведённым Вами выше именем «істина» без каких-либо проблем. »

То был другой пример.
А теперь попробуйте создать скрытую системную папку с именем "Книжная серия Прочесть обязательно і"
и применить этот код без ключа ~sn:
Код:

for /f "delims=" %%a in ('dir /b /a') do (attrib -s -h -r "%%a" >nul)

Iska 19-12-2011 18:16 1818084

Diskretor, ряд вопросов:

1. Вам действительно надо сие проделывать для содержимого одной папки, без вложенных? Или потом обработка вложенных папок понадобится?
2. Использование какого-либо стороннего средства допустимо по условиям задачи?

Цитата:

Цитата Diskretor
А теперь попробуйте создать скрытую системную папку с именем "Книжная серия Прочесть обязательно і"
и применить этот код без ключа ~sn: »

Делайте так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

chcp 1251

for /f "delims=" %%i in ('dir /b /a') do attrib -s -h -r "%%i"

chcp 866

endlocal
exit /b 0


Dragokas 19-12-2011 20:34 1818192

Цитата:

Цитата Iska
1. Вам действительно надо сие проделывать для содержимого одной папки, без вложенных? Или потом обработка вложенных папок понадобится? »

Никоим образом не понадобится. Только для содержимого корневого каталога без рекурсивности.

Цитата:

Цитата Iska
2. Использование какого-либо стороннего средства допустимо по условиям задачи? »

Не допустимо. Только встроенные средства Винды и желательно универсальные для разных версий ОС.
(все остальные варианты чисто ради образовательных для меня целей - мне было бы очень интересно. Благодарю).

Код - ок, попробую, разберу, отпишусь.

Dragokas 19-12-2011 21:02 1818214

Оригинально - нужно было всего лишь сменить раскладку "chcp". Все сработало идеально. Вопрос закрыт.
Только убрал лишний код:
Код:

setlocal enableextensions enabledelayedexpansion
endlocal


Iska 20-12-2011 00:53 1818365

Цитата:

Цитата Diskretor
Никоим образом не понадобится. Только для содержимого корневого каталога без рекурсивности. »

Цитата:

Цитата Diskretor
Не допустимо. Только встроенные средства Винды и желательно универсальные для разных версий ОС. »

Тогда попробуйте WSH. Например, так:
Код:

Option Explicit

Dim strFolder

Dim objFolder
Dim objFile

With WScript.Arguments.Named
        If .Count = 1 Then
                If .Exists("Path") Then
                        strFolder = .Item("Path")
                       
                        With WScript.CreateObject("Scripting.FileSystemObject")
                                If .FolderExists(strFolder) Then
                                        For Each objFolder In .GetFolder(strFolder).SubFolders
                                                ClearAttributes objFolder
                                        Next
                                       
                                        For Each objFile In .GetFolder(strFolder).Files
                                                ClearAttributes objFile
                                        Next
                                Else
                                        WScript.Echo "Folder [" & strFolder & "] not found"
                                End If
                        End With
                Else
                        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ /Path:""<path to folder>"""
                End If
        Else
                WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ /Path:""<path to folder>"""
        End If
End With

WScript.Quit
'=============================================================================

'=============================================================================
Sub ClearAttributes(objValue)
        Const ReadOnly  = 1
        Const Hidden    = 2
        Const System    = 4
       
        Select Case TypeName(objValue)
                Case "Folder", "File"
                        With objValue
                                If .Attributes And (ReadOnly Or Hidden Or System) Then
                                        .Attributes = .Attributes And Not (ReadOnly Or Hidden Or System)
                                End If
                        End With
                Case Else
                        ' Nothing to do
        End Select
End Sub
'=============================================================================

Цитата:

Цитата Diskretor
все остальные варианты чисто ради образовательных для меня целей - мне было бы очень интересно. »

Есть такое средство — Log Parser (Download: Log Parser 2.2 - Microsoft Download Center - Download Details). Если Вы мало-мальски знакомы с синтаксисом SQL, то рекомендую опробовать, ибо скорость его работы при множественных критериях отбора поистине впечатляет.

Например, поставленная выше задача отбора может выглядеть так:
Код:

"C:\Program Files\Log Parser 2.2\LogParser.exe" "SELECT Path USING Attributes AS Attr FROM E:\Песочница\0101\*.* WHERE Attr LIKE '__S______' OR Attr LIKE '___H_____' OR Attr LIKE '____R____'" -i:FS -q:ON -oCodepage:1251 -recurse:0
или так:
Код:

"C:\Program Files\Log Parser 2.2\LogParser.exe" "SELECT Path USING STRCNT(REPLACE_CHR(Attributes, 'SHR', '*'), '*') AS AnyAttrOfSHR FROM E:\Песочница\0101\*.* WHERE AnyAttrOfSHR > 0" -i:FS -q:ON -oCodepage:1251 -recurse:0
Полученный вывод команды разбирается, как и обычно, посредством «for /f …» с предварительным «chcp 1251».


Время: 00:58.

Время: 00:58.
© OSzone.net 2001-