none
Проверить количество томов жестких дисков RRS feed

  • Вопрос

  • День добрый.

    подскажите, как в PowerShel (PoSh) проверить количество разделов и их буквы сугубо для жестких дисков (флешки, карты памяти, сетевые диски и оптические приводы не интерисуют)

    ?

    Заранее благодарен.
    2 июня 2009 г. 21:25

Ответы

  • тогда это делается как-то так:
    Get-Content computers.txt | %{
        $name = $_
        gwmi win32_logicaldisk -ComputerName $name -Filter "DriveType = 3" | %{"defrag $($_.DeviceID) /v > c:\GSupport\Reports\Defrag_C_%computername%_%Date%.xls'" >> $($name + "_PoshBat.bat")}
    }
    он для каждого компьютера сделает свой батник. В имени каждого батника будет указано имя компьютера.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Mirac 3 июня 2009 г. 11:41
    3 июня 2009 г. 10:52
  • значит так. Вам нужно в любой папке создать файл computers.txt и этот путь прописать для команды Get-Content. В этом файле в столбик пишите имена всех компьютеров для которых нужно сделать такой батник. После чего в текущей папке появится набор уже готовых батников.


    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Mirac 3 июня 2009 г. 11:41
    3 июня 2009 г. 11:08
  • PowerShell использует по умолчанию Unicode, от чего древний cmd очень удивляется :)
    Так для "хитрого алиаса" > указать кодировку нельзя, используйте командлет Out-File напрямую:

    Get-Content computers.txt | %{
       
    $name = $_
       
    gwmi win32_logicaldisk -ComputerName $name -Filter "DriveType = 3" | %{"defrag $($_.DeviceID) /v > c:\GSupport\Reports\Defrag_C_%computername%_%Date%.xls'" |Out-File -Append -Encoding ASCII $($name + "_PoshBat.bat")}
    }

    Еще можно использовать командлеты Set-Content и Add-Content.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 4 июня 2009 г. 7:53
    • Отменено предложение в качестве ответа Mirac 4 июня 2009 г. 8:27
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:27
    • Снята пометка об ответе Mirac 4 июня 2009 г. 8:33
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:44
    Модератор
  • Get-Content computers.txt | %{
        $name = $_
        gwmi win32_logicaldisk -ComputerName $name -Filter "DriveType = 3" | `
        %{"defrag $($_.DeviceID) /v > c:\GSupport\Reports\Defrag_C_%computername%_%Date%.xls'" | Out-File $($name + "_PoshBat.bat") -Encoding ASCII -Append}
    }

    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:27
    • Снята пометка об ответе Mirac 4 июня 2009 г. 8:33
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:44
  • сделал так:
    $C = 0
    $deviceID = "C:"
    $C = (Get-WmiObject "Win32_LogicalDisk WHERE DeviceID='$deviceID'").Count
    $El = Get-WmiObject "Win32_LogicalDisk WHERE DeviceID='$deviceID'"
    if  ($C = 1) {
    	If ($El.driveType -eq 3) {
    		$El.driveType
    		'Defrag C: \v > c:\GSupport\Reports\Defrag_C_%Hostname%_%Date%.xls' >> c:\PoshBat.bat
    	}	
    }

    все бы хорошо.. да не хочется так проверять каждую букву...
    как бы это в цикле сделать?

    • Помечено в качестве ответа Mirac 3 июня 2009 г. 11:41
  • ответ нашел сам: 1. Если сделать так: "Привет" | Out-File -Append -Encoding Default GlobalProfilactic.bat то в файле окажется нормальное представление русского слова но если это слово, например путь к папке ("cd c:\Администратор" | Out-File -Append -Encoding Default GlobalProfilactic.bat), то при выполнении GlobalProfilactic.bat CMD не найдет такого пути.... 2. а вот если сделать так: "cd c:\Администратор" | Out-File -Append -Encoding OEM GlobalProfilactic.bat то в файле GlobalProfilactic.bat мы увмдим набор "краказябликов" типа Ђ¤¬Ё­Ёбва в®а НО зато такой путь будет нормально восприянт CMD и все будет работать... логики в этом конечно маловато, но все же.. работает...
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 10:22
    4 июня 2009 г. 10:17

Все ответы

  • Например так:

    Get-WmiObject win32_logicaldisk | where {$_.driveType -eq 3}

    Количество:

    (Get-WmiObject win32_logicaldisk | where {$_.driveType -eq 3}).count


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 3 июня 2009 г. 4:18
    • Помечено в качестве ответа Mirac 3 июня 2009 г. 6:57
    • Снята пометка об ответе Mirac 3 июня 2009 г. 6:57
    Модератор
  • лучше использовать фильтры WMI, чем where-object:
    Get-WmiObject win32_logicaldisk -filter "driveType = 3"

    особенно при работе по сети. Иначе WMI по сети вытащит все типы дисков и локально уже отфильтровываться.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • спасибо огромное, но это не совсем то, что мне надо...

    мне нужно, типа, перебрать все девайсы в цикле, и покаесть девайсы с тайпом 3 добавлять строки в файл.
    более детально: мне нужно узнать кол-во разделов и их букв для того, что б построить батник с вот таким вот кодом:

    defrag c: /v > d:\reports\Defrag_Report.txt

    первое, что нужно проверить - наличие диска D, для хранения данных.

    затем надо таких строк сделать столько, сколько разделов мы имеем...

    заренее благодарен

  • if (Test-Path D:\) {
        Get-WmiObject win32_logicaldisk -filter "driveType = 3" | %{defrag $($_.DeviceID) /v >> d:\reports\Defrag_Report.txt}
    }
    типа такого. Или предложите нам ещё потелепатировать?
    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • Vadims Podans
    по сути то, но не совсем)

    мне не надо в ПоШ делать саму дефрагментацию... мне надо проверить кол-во разделов и, для разделов жоского диска, построить батник с строками...

    Батник должен выглядеть так:

    defrag c: /v > d:\reports\Defrag_Report_C.txt
    defrag d: /v > d:\reports\Defrag_Report_D.txt
    defrag e: /v > d:\reports\Defrag_Report_E.txt
    .......
    defrag x: /v > d:\reports\Defrag_Report_X.txt

    ПоШ тут только ради того, что б строить батник автоматически, а не ручками под каждый комп.
    просто бывает так, что разделы разбросаны, а не идут в алфавитном порядке (либо сидюк в букву D вклинился, либо кардридер забрас буквы C,D,E,F (такое тоже встречал)

    грубо говоря (простите за мой синтаксис, програмирую немного на 1С):

    $col = (Get-WmiObject win32_logicaldisk | where {$_.driveType -eq 3}).count
    раздел = 1
    пока 1 = 1 цикл
    ДолучитьРаздел(Раздел)
    	Если Кол < $col тогда
    		Если ПолучитьРаздел.Тип = 3 Тогда
    			ИД = ПолучитьРаздел.ИД
    			Батник.Новаястрока()
    			Батник.Строка = "Defrag " + ИД + " \v > c:\reports\Defrag_Report_" + ИД + ".txt"
    		КонецЕсли
    	Иначе
    		Прервать
    	КонецЕсли
    КонецЦикла
    

    про проверку наличия раздела D можно забыть... все будет на С

  • сделал так:
    $C = 0
    $deviceID = "C:"
    $C = (Get-WmiObject "Win32_LogicalDisk WHERE DeviceID='$deviceID'").Count
    $El = Get-WmiObject "Win32_LogicalDisk WHERE DeviceID='$deviceID'"
    if  ($C = 1) {
    	If ($El.driveType -eq 3) {
    		$El.driveType
    		'Defrag C: \v > c:\GSupport\Reports\Defrag_C_%Hostname%_%Date%.xls' >> c:\PoshBat.bat
    	}	
    }

    все бы хорошо.. да не хочется так проверять каждую букву...
    как бы это в цикле сделать?

    • Помечено в качестве ответа Mirac 3 июня 2009 г. 11:41
  • тогда это делается как-то так:
    Get-Content computers.txt | %{
        $name = $_
        gwmi win32_logicaldisk -ComputerName $name -Filter "DriveType = 3" | %{"defrag $($_.DeviceID) /v > c:\GSupport\Reports\Defrag_C_%computername%_%Date%.xls'" >> $($name + "_PoshBat.bat")}
    }
    он для каждого компьютера сделает свой батник. В имени каждого батника будет указано имя компьютера.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Mirac 3 июня 2009 г. 11:41
    3 июня 2009 г. 10:52
  • это типа функция?
    что то она ничего у меня не делает.. выполняется и все.. и больше ничего(
    3 июня 2009 г. 11:06
  • значит так. Вам нужно в любой папке создать файл computers.txt и этот путь прописать для команды Get-Content. В этом файле в столбик пишите имена всех компьютеров для которых нужно сделать такой батник. После чего в текущей папке появится набор уже готовых батников.


    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Mirac 3 июня 2009 г. 11:41
    3 июня 2009 г. 11:08
  • Vadims Podans

    Спасибо огромное!!!
    3 июня 2009 г. 11:43
  • Vadims Podans
    возникла проблемка:

    Батники не выполняются!


    текст батника
    defrag C: /v > c:\GSupport\Reports\Defrag_C_%computername%_%Date%.xls
    defrag D: /v > c:\GSupport\Reports\Defrag_D_%computername%_%Date%.xls
    defrag E: /v > c:\GSupport\Reports\Defrag_E_%computername%_%Date%.xls
    судя по всему перед первым символом "d" вкрадывается какой то служебный символ.
    если скопировать содержимое батника в другой батник, то:
    1. все нормально работает
    2. меняется размер файла (mirac-book_PoshBat.bat = 429 байт, mirac-book_PoshBat_1.bat = 213 байт)

    как поборотся?
  • PowerShell использует по умолчанию Unicode, от чего древний cmd очень удивляется :)
    Так для "хитрого алиаса" > указать кодировку нельзя, используйте командлет Out-File напрямую:

    Get-Content computers.txt | %{
       
    $name = $_
       
    gwmi win32_logicaldisk -ComputerName $name -Filter "DriveType = 3" | %{"defrag $($_.DeviceID) /v > c:\GSupport\Reports\Defrag_C_%computername%_%Date%.xls'" |Out-File -Append -Encoding ASCII $($name + "_PoshBat.bat")}
    }

    Еще можно использовать командлеты Set-Content и Add-Content.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 4 июня 2009 г. 7:53
    • Отменено предложение в качестве ответа Mirac 4 июня 2009 г. 8:27
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:27
    • Снята пометка об ответе Mirac 4 июня 2009 г. 8:33
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:44
    Модератор
  • Get-Content computers.txt | %{
        $name = $_
        gwmi win32_logicaldisk -ComputerName $name -Filter "DriveType = 3" | `
        %{"defrag $($_.DeviceID) /v > c:\GSupport\Reports\Defrag_C_%computername%_%Date%.xls'" | Out-File $($name + "_PoshBat.bat") -Encoding ASCII -Append}
    }

    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:27
    • Снята пометка об ответе Mirac 4 июня 2009 г. 8:33
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 8:44
  • Спасибо всем огромное!
    • Изменено Mirac 4 июня 2009 г. 8:44
  • и еще вопросик )

    в одной из строк, которые я запихиваю в батник присутствует русское слово... просле отправки в файл способом 

    |Out-File -Append -Encoding ASCII $($name + "_PoshBat.bat")
    я в файле получаю надор типа "??????????????".

    можно ли как то это слово "оставить в живых" ??
  • ответ нашел сам: 1. Если сделать так: "Привет" | Out-File -Append -Encoding Default GlobalProfilactic.bat то в файле окажется нормальное представление русского слова но если это слово, например путь к папке ("cd c:\Администратор" | Out-File -Append -Encoding Default GlobalProfilactic.bat), то при выполнении GlobalProfilactic.bat CMD не найдет такого пути.... 2. а вот если сделать так: "cd c:\Администратор" | Out-File -Append -Encoding OEM GlobalProfilactic.bat то в файле GlobalProfilactic.bat мы увмдим набор "краказябликов" типа Ђ¤¬Ё­Ёбва в®а НО зато такой путь будет нормально восприянт CMD и все будет работать... логики в этом конечно маловато, но все же.. работает...
    • Помечено в качестве ответа Mirac 4 июня 2009 г. 10:22
    4 июня 2009 г. 10:17
  • Логика в этом есть... Cmd мало того что не использует Unicode, так он по умолчанию еще и системную кодировку (Default) не использует, а предпочитает ей cp866 (OEM).


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    4 июня 2009 г. 11:03
    Модератор