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

totopolis 20-09-2016 12:10 2670440

Перебор жетских дисков в системе, запуск утилиты для каждого из них
 
Всем привет!
Прошу вашей помощи в написании скрипта для групповой политики.
Скрипт должен делать следующее:
Для каждого жесткого диска с назначенной буквой запускать утилиту sdelete.
Данной утилите указывается диск, с которым она должна работать, в следующем виде:
Код:

sdelete -z [буква диска]:
Наример так:
Код:

sdelete -z c:
Первая трудность с которой я столкнулся - отсеивание дисков по типу. Утилита не должна запускаться для USB-дисков, дисководов и сетевых дисков.
Попробовал через пакетный файл windows (батник) и утилиту fsutil, но далеко не ушел:
Код:

@echo off
for %%i in (C D E) do fsutil fsinfo drivetype %%i:

Наверняка данные операции можно коротко и красиво проделать с помощью Powershell. Единственное ограничение для нас - версия не выше 2.0 (она по умолчанию стоит на win server 2008R2).

Если кто-то уже сталкивался с похожей задачей - помогите решением.

Kazun 20-09-2016 13:10 2670457

Код:

Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3 and DeviceID LIKE'%:'" | Foreach {
        C:\utils\sdelete -z $_.DeviceID
}


megaloman 20-09-2016 22:16 2670624

Если принципиально cmd попробуйте
Код:

@Echo Off
cls
chcp 437 >nul

FOR /F "usebackq tokens=1,*" %%c IN (`fsutil fsinfo drives`) DO Set "AllD=%%d"
Set "AllD=%AllD::\=%"

FOR %%d IN (%AllD%) DO FOR /F "usebackq tokens=3,4" %%i IN (`fsutil fsinfo drivetype %%d:`) DO If "%%i%%j"=="FixedDrive" Echo sdelete -z %%d:

chcp 866 >nul
pause

В боевом варианте Echo уберите, cls и pause тоже

greg zakharov 21-09-2016 10:34 2670718

Код:

@echo off
  for /f %%i in (
    'wmic logicaldisk where^
    "drivetype=3 and deviceid!=null"^
    get deviceid ^| findstr /rc:":"'
  ) do C:\tools\sdelete.exe -z %%i
exit /b


totopolis 21-09-2016 11:54 2670756

Всем спасибо за ответы, особенно за решение на Powershell.
Своими силами доделал то, что начал сам. Получилось вот что:
Код:

@echo off

::Перебираем возможные буквы дисков
for %%a in (A B C D E F G H I J K L N M O P Q R S T U V W X Y Z) do (

      ::Отбросив лишнее, записываем в переменную i значение, возвращенное командой fsutil fsinfo drivetype
        for /F "tokens=3" %%i in ('fsutil fsinfo drivetype %%a:') do (

              ::Если записанное значение совпадает с "†ҐбвЄЁ©" ("Жесткий" в кодировке  CP866) или "Fixed" (для англоязычной версии ОС), запускаем sdelete
                for %%s in (†ҐбвЄЁ© Fixed) do if %%s==%%i start C:\temp\sdelete.exe -z %%a:


megaloman 21-09-2016 20:41 2670944

totopolis, У нас с Вами в принципе батники сделаны по одной идее. Но я не перебираю все возможные буквы дисков по алфавиту - я список имеющихся в системе дисков получаю посредством fsutil fsinfo drives.
И, что интереснее, если задать кодовую страницу chcp 437, то команда fsutil fsinfo drivetype выдаст статус диска на английском языке, что делает ненужным извращаться в переборе †ҐбвЄЁ© Fixed
Но то, что сделано своими руками, всегда милее :)


Время: 20:17.

Время: 20:17.
© OSzone.net 2001-