Войти

Показать полную графическую версию : [решено] Украинская "і" и скрытые файлы


Dragokas
18-12-2011, 21:50
Как произвести действие (например 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
2) Объясните, пожалуйста, что такое ~sn ? »
Будут использоваться короткие имена в пути к файлу. Об этом явно сказано в:
for /?

и каким образом "істина" и "6C78~1", получаемое этим ключем, означают одну и ту же папку »
В Вашем конкретном случае «6C78~1» представляет собой короткое имя для записи «істина» (8.3 filename (http://en.wikipedia.org/wiki/8.3), Long filename (http://en.wikipedia.org/wiki/Long_filename), NTFS: 3.3 Hard links and short filenames (http://en.wikipedia.org/wiki/Master_File_Table#Hard_links_and_short_filenames)).

что это за вариант 8.3 стандарта »
Самый обычный вариант. По-русски, принципы формирования коротких имён для разных файловых систем, поддерживаемых ОС Windows, Вы можете посмотреть, например, здесь: 1. Концепции Windows NT: 1.5.3. Короткие имена (http://citforum.ru/operating_systems/winntadm/winntadm_011.shtml#153).

Dragokas
19-12-2011, 01:43
Спасибо, почитаю. Остается вопрос: как совместить эти 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
1. А есть ли какой-либо смысл делать отбор по атрибутам, коль Вы их и так сбрасываете? Просто снимайте эти атрибуты для всех папок/файлов, только и всего.
2. Мне не понятны эти игры с короткими именами. У меня «attrib.exe» отработал с приведённым Вами выше именем «істина» без каких-либо проблем.

Dragokas
19-12-2011, 12:15
1. А есть ли какой-либо смысл делать отбор по атрибутам, коль Вы их и так сбрасываете? Просто снимайте эти атрибуты для всех папок/файлов, только и всего. »
Да, есть смысл. Чтобы сократить время, расходуемое на изменение атрибутов (при огромном количестве папок и файлов, да еще и при включенном антивируснике - набор постоянно разный). Мне важно максимальное быстродействие. Приведенные 6 команд справляются на ура, но хотелось бы как-то лаконичней что-ли.

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
Diskretor, ряд вопросов:

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

А теперь попробуйте создать скрытую системную папку с именем "Книжная серия Прочесть обязательно і"
и применить этот код без ключа ~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
1. Вам действительно надо сие проделывать для содержимого одной папки, без вложенных? Или потом обработка вложенных папок понадобится? »
Никоим образом не понадобится. Только для содержимого корневого каталога без рекурсивности.

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

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

Dragokas
19-12-2011, 21:02
Оригинально - нужно было всего лишь сменить раскладку "chcp". Все сработало идеально. Вопрос закрыт.
Только убрал лишний код:

setlocal enableextensions enabledelayedexpansion
endlocal

Iska
20-12-2011, 00:53
Никоим образом не понадобится. Только для содержимого корневого каталога без рекурсивности. »
Не допустимо. Только встроенные средства Винды и желательно универсальные для разных версий ОС. »
Тогда попробуйте 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
'=============================================================================

все остальные варианты чисто ради образовательных для меня целей - мне было бы очень интересно. »
Есть такое средство — Log Parser (http://technet.microsoft.com/ru-ru/scriptcenter/dd919274) (Download: Log Parser 2.2 - Microsoft Download Center - Download Details (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24659)). Если Вы мало-мальски знакомы с синтаксисом 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».




© OSzone.net 2001-2012