Ужастик :) Определение свободного места на дисках общих папок

Сейчас в чате всплыла задачка – как бы посмотреть свободное место на дисках соответствующих общим папкам. Причем метод через WMI показался слишком медленным, решать задачу средствами .Net было лень (так как навскидку не помню нужных классов, пришлось бы искать в msdn), ну а использование шустрейшего WinAPI требовало слишком много строк 🙂 Поэтому я решил пойти ужасно не красивым, зато действенным способом – разобрать текстовый вывод старых .exe утилит использующих API 🙂 Парсер для двух утилит с совершенно разным форматом вывода удалось набросать достаточно быстро 🙂 Причем выводит он уже не просто текст, а полноценные объекты, в лучших традициях PowerShell:

net share |where{$_ -match '^(\S+)\s+([a-z]:)\\'}|            
select @{name="Share";expression={$matches[1]}},             
    @{n="Disk";e={$matches[2]}},             
    @{n="FreeBytes";e={(fsutil volume diskfree $matches[2])[0] -replace '^.+: '}}
Опубликовано в Command line parsing. Метки: , , . 2 комментария »

Квадратные скобки в именах файлов

Вы наверное знаете, что в PowerShell, в качестве подстановочных знаков можно использовать не только ? и * как в cmd.exe, но и группы символов в квадратных скобках, например так:

substsquare

Читать далее…

Особенности Net.exe Share

Продолжаю тему использования старых утилит с “особенным” синтаксисом из PowerShell. Следующий пациент – это Net share. Основной функционал этой команды вполне работает при вызове из PowerShell, но…

По умолчанию общие папки начиная с WIndows 2003 (если не ошибаюсь) создаются с разрешением everyone=read. Однако одной из рекомендованных практик раздачи разрешений является выдача на доступ к общей папке everyone=full control, и раздача необходимых разрешений уже средствами NTFS. Это сильно упрощает администрирование, так как не приходится сверять оба списка доступа.

Если посмотреть справку к команде net share то видно что разрешение можно задавать непосредственно в момент создания общей папки:

PS C:\Windows\System32> net share /?
The syntax of this command is:

NET SHARE
sharename
          sharename=drive:path [/GRANT:user,[READ | CHANGE | FULL]]
                               [/USERS:number | /UNLIMITED]
                               [/REMARK:"text"]
                               [/CACHE:Manual | Documents| Programs | None ]
          sharename [/USERS:number | /UNLIMITED]
                    [/REMARK:"text"]
                    [/CACHE:Manual | Documents | Programs | None]
          {sharename | devicename | drive:path} /DELETE
          sharename \\computername /DELETE

Однако если попробовать выполнить такую команду в PowerShell, у нас ничего не получится. Ну точнее net выведет справку по синтаксису, будто мы что то сделали неправильно…:

PS C:\Windows\System32> net share myshare=Q:\temp /GRANT:everyone,FULL
The syntax of this command is:
...

Что интересно, если запустить cmd.exe и выполнить в нём ту же команду, то всё отрабатывает прекрасно. В чем же дело? Выяснить как эта команда выглядит для net.exe поможет файл testargs.cmd который я описал в предыдущем посте из серии:

PS C:\Windows\System32> c:\root\testargs.cmd share myshare=Q:\temp /GRANT:everyone,FULL
Arg1: [share]
Arg2: [myshare]
Arg3: [Q:\temp]
Arg4: [/GRANT:everyone]
Arg5: [FULL]

Теперь хорошо видно что PowerShell посчитал /GRANT:everyone,FULL массивом из двух строк (из за запятой), и передал их утилите по отдельности. Избежать этого опять же несложно, либо замаскировать запятую с помощью обратного апострофа:

PS C:\Windows\System32> net share myshare=Q:\temp /GRANT:everyone`,FULL
myshare was shared successfully.

либо заключить последний параметр в кавычки.

PS C:\Windows\System32> net share myshare=Q:\temp "/GRANT:everyone,FULL" 
myshare was shared successfully.

Как видите всё достаточно просто 🙂

Опубликовано в Command line parsing. Метки: , , , , . 1 Comment »

Bcdedit.exe из PowerShell

Недавно я столкнулся с необходимостью отредактировать элементы загрузки с помощью утилиты bcdedit.exe. Эта утилита используется в системах начиная с Vista, для управления хранилищем конфигурации загрузки, которое заменило boot.ini.

Разумеется я решил запускать утилиту из PowerShell (так как дело происходило на Windows Server 2008R2, то PowerShell было запустить даже проще и быстрее чем cmd.exe 😉 ).

Читать далее…

Опубликовано в Command line parsing. Метки: , , . 5 комментариев »