Войти

Показать полную графическую версию : [решено] Перебор жетских дисков в системе, запуск утилиты для каждого из них


totopolis
20-09-2016, 12:10
Всем привет!
Прошу вашей помощи в написании скрипта для групповой политики.
Скрипт должен делать следующее:
Для каждого жесткого диска с назначенной буквой запускать утилиту 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
Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3 and DeviceID LIKE'%:'" | Foreach {
C:\utils\sdelete -z $_.DeviceID
}

megaloman
20-09-2016, 22:16
Если принципиально 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
@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
Всем спасибо за ответы, особенно за решение на 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
totopolis, У нас с Вами в принципе батники сделаны по одной идее. Но я не перебираю все возможные буквы дисков по алфавиту - я список имеющихся в системе дисков получаю посредством fsutil fsinfo drives.
И, что интереснее, если задать кодовую страницу chcp 437, то команда fsutil fsinfo drivetype выдаст статус диска на английском языке, что делает ненужным извращаться в переборе †ҐбвЄЁ© Fixed
Но то, что сделано своими руками, всегда милее :)




© OSzone.net 2001-2012