Войти

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


Bars66
02-03-2009, 18:21
нужен батник для определения оставшегося размера жеского диска например более 1 гб тогда запускается копирование файлов а если меньше тогда выходит

Bars66
02-03-2009, 18:31
глядите что за прогу сделал
(батник должен быть в C:\22\1.bat)
@Echo Off
SetLocal EnableExtensions
:Loop
Set UniqFolder=md5%Random%9%Random%88%Random%6%Random%5%Random%
If Exist %UniqFolder% GoTo :Loop
MD C:\1\6\%UniqFolder%
copy C:\22\1.bat C:\1\6\%UniqFolder%
start C:\1\6\%UniqFolder%\1.bat

Maza Faka
03-03-2009, 09:43
нужен батник для определения оставшегося размера жеского диска например более 1 гб тогда запускается копирование файлов а если меньше тогда выходит »
Можно используя Микрософт утилиту freedisk.exe (можно найти в Гугле)

@Echo Off

freedisk.exe /D c: 1GB>Nul
If ERRORLEVEL 1 GoTo :EOF

::Здесь ваш код

foxbat
03-03-2009, 11:53
если батник не обязателен то вот на VBS:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set DriveC = FSO.GetDrive("C:")
If DriveC.FreeSpace>1048576 then
FSO.CopyFile "C:\filename.txt", "D:\", 0

Bars66
04-03-2009, 05:38
А что такое VBS

Maza Faka
04-03-2009, 06:44
А что такое VBS »
А что такое Google? :) Visual Basic Scripting Edition (http://ru.wikipedia.org/wiki/VBScript)
Скопируй код foxbat-a в любой текстовый редактор, сохрани как FileName.vbs и запускай как EXE файл.

Morpheus
25-01-2011, 12:40
Всем привет!
А если не свободное место, а просто размер системного раздела вычислить? Если больше 30GB - выполнить одну команду, если меньше - другую.

Ivan Bardeen
25-01-2011, 13:37
Всем привет!
А если не свободное место, а просто размер системного раздела вычислить? Если больше 30GB - выполнить одну команду, если меньше - другую. »
Вот с помощью скрипта на VBS

strComputer = "."
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2")
Set colItems = objWMIService.ExecQuery("Select Capacity from Win32_Volume WHERE SystemVolume = True",,48)
For Each objItem in colItems
SVCapacity = objItem.Capacity
If SVCapacity > 30000000000 Then
cmd = WSHShell.Run("команда1",0,True)
Else
cmd = WSHShell.Run("команда2",0,True)
End If
Next

Vadikan
25-01-2011, 13:42
А если не свободное место, а просто размер системного раздела вычислить? »
PowerShell

$drive = ((Get-WmiObject Win32_LogicalDisk | Where-Object {$_.DeviceID -eq $(Get-WmiObject Win32_Operatingsystem).systemdrive}).size)/1gb
$drive

Я же тебе показывал скрипт ;) Свободное место тоже можно вычислить...

С вызовом команд как-то так:

$command1, $command2 = "cmd /c echo command1", "cmd /c echo command2"
$drive = ((Get-WmiObject Win32_LogicalDisk | Where-Object {$_.DeviceID -eq $(Get-WmiObject Win32_Operatingsystem).systemdrive}).size)/1gb
IF ($drive -gt 30) {invoke-expression $command1} else {invoke-expression $command2}

Morpheus
25-01-2011, 14:32
Ivan Bardeen, спасибо! Всё ок.
Vadikan, спасибо! Всё ок. PS ещё не интегрировался в мою жизнь, так что пока оно коряво. Из батника запускается выполнение скрипта PS, а оттуда опять команда cmd :)

Vadikan
25-01-2011, 14:42
PS ещё не интегрировался в мою жизнь, так что пока оно коряво. Из батника запускается выполнение скрипта PS, а оттуда опять команда cmd »
В этом нет ничего корявого. Команды PS вовсе не обязательно выполнять в консоли PS, главное - результат.

SendMessage
25-01-2011, 15:34
Ну тогда для коллекции батник еще:
for /f "skip=1" %%i in ('wmic path Win32_logicaldisk.name^="%systemdrive%" get size') do if %%i gtr 32212254720 (command1) else (command2)


Ах ты ж.
Petya V4sechkin, совсем забыл. :)

Petya V4sechkin
25-01-2011, 15:40
SendMessage, ага, я тоже хотел сделать батник, но CMD понимает только 32-битные целые числа (поэтому сравнение с 32212254720 невозможно).

Morpheus
25-01-2011, 16:30
Vadikan, всё же я переделал команды под PS.
SendMessage, спасибо за попытку! Вариант с батником был бы тоже интересен.

amel27
25-01-2011, 16:37
тогда уж как-то так:
@echo off
SETLOCAL EnableDelayedExpansion

set $z=0& for /f "skip=1 tokens=1,2" %%a in (
'"wmic logicaldisk where name="%SystemDrive%" get size,volumename"'
) do if not "%%b"=="" set "$z=%%a"& set/a "$z=!$z:~,-9!+0"

if %$z% gtr 32 (command1) else command2

Vadikan
25-01-2011, 16:43
Все равно крутимся вокруг Win32_LogicalDisk :)

Исправил заголовок темы.

P.S. Вот PS скрипт для создания отчета о месте на всех дисках системы. Его надо допиливать под свои нужды, но идея сбора инфы понятна http://powershell.com/cs/media/p/1617.aspx

SendMessage
25-01-2011, 18:00
CMD понимает только 32-битные целые числа (поэтому сравнение с 32212254720 невозможно). »
Вот попробовал обойти (неоптимизировано, правда):
setlocal enabledelayedexpansion
for /f "skip=1" %%i in ('wmic path Win32_logicaldisk.name^="%systemdrive%" get size') do (
set size=%%i
set /a sizeM=!size:~0,-9!+0
set /a sizeL=!size:~-9!+0
)
if !sizeM! gtr 32 (
echo command1
) else (
if !sizeM! equ 32 (
if !sizeL! gtr 212254720 (echo command1) else (echo command2)
) else (
echo command2
)
)
Вроде по тестам работает правильно.

Ага, тут уже есть. И не такое громоздкое. :)

amel27
25-01-2011, 18:39
попробовал обойти »
а нужна ли такая точность?.. кстати, сравнивать вроде как можно не только числа, но и строки (если они одинаковой длины), поэтому достаточно перед сравнением дополнить строку слева нулями до 18 символов (максимум для 64-битного числа):
@echo off
SETLOCAL EnableDelayedExpansion

set $z=0& for /f "skip=1 tokens=1,2" %%a in (
'"wmic logicaldisk where name="%SystemDrive%" get size,volumename"'
) do if not "%%b"=="" set "$z=000000000000000000%%a"& set "$z=!$z:~-18!"

if "%$z%" gtr "000000032212254720" (command1) else command2

Morpheus
25-01-2011, 21:04
SendMessage, спасибо, но не срабатывает, оба раза выдаёт command2.
amel27, спасибо, работает.

Vadikan
26-01-2011, 23:13
Morpheus, посмотрел внимательнее синтаксис PS и сократил скрипт в 9 (http://forum.oszone.net/post-1596844-9.html) с пяти строк до трех ;)




© OSzone.net 2001-2012