Показать полную графическую версию : [решено] Показать параметр 'описание'
Arsenik77
30-05-2019, 08:40
Добрый день.
Как присвоить переменной значение 'описание' см. влож.
Стоят win10.
win10 »
powershell
$a = (gwmi win32_operatingsystem|select description).description
$a
cmd
@echo off
for /f %%i in ('powershell -nol -c "&{(gwmi win32_operatingsystem|select description).description}"') do set var=%%i
echo %var%
Arsenik77
30-05-2019, 09:18
Отлично работает, но хотелось бы для узнать этот параметр у компьютеров находящихся в своей подсетки (не только локального).
Arsenik77, у командлета Get-WMIObject (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-wmiobject?view=powershell-5.1) есть параметр ComputerName.
Arsenik77
30-05-2019, 10:14
Вот так примерно
for /f "delims=" %%i in ('powershell -nol -c "&{(gwmi -computername %KK% win32_operatingsystem).description}"') do set var=%%i
echo %var%
у компьютеров находящихся в своей подсетки »
для powershell, от имени админа:
icm -comp SRV1,SRV2,SRV3 -scr {(gwmi win32_operatingsystem|select description).description}
YuS_2, может, так даже и лучше. У Wbem иногда случаются совершенно невразумительные отказы при попытках сетевого взаимодействия.
Wbem иногда случаются совершенно невразумительные отказы при попытках сетевого взаимодействия »
Именно! А раз уж везде win 10, то подумалось так: зачем печку топить, когда есть центральное отопление. :)
PS
Кстати, сам не понял, зачем я в код засунул |select description, оно там излишне...
Вот так примерно »
если таки надо в cmd запускать именно, то:
@echo off
echo Administrative permissions required. Detecting permissions...
net session >nul 2>&1
if errorLevel 1 echo Failure: Current permissions inadequate.&pause&exit /b
for /f %%i in (
'powershell -nol -c "&{icm -comp SRV1,SRV2,SRV3 -scr {(gwmi win32_operatingsystem).description}}"'
) do set var=%%i&call :out
pause&exit /b
:out
echo %var%
exit /b
YuS_2, в cmd это делается вызовом wmic.exe:
wmic OS SET Description='6 этаж'
вызовом wmic.exe »
Можно, конечно... да только:
подумалось так: зачем печку топить, когда есть центральное отопление. »
Потому что:
иногда случаются совершенно невразумительные отказы при попытках сетевого взаимодействия. »
а надо ведь ещё и:
хотелось бы для узнать этот параметр у компьютеров находящихся в своей подсетки (не только локального). »
Arsenik77
30-05-2019, 13:03
Появилась проблемка, не до конца показывается переменная var, если есть пробел в описании то только до него показывается.
В моем варианте for /f %%i in ('powershell -nol -c "&{(gwmi -computername kkk win32_operatingsystem|select description).description}"') do set var=%%i
если локально то все нормально.
не до конца показывается переменная var, если есть пробел в описании то только до него показывается. »
До конца, до конца. Добавьте параметр "delims=" в цикл разбора по for /f.
Arsenik77
30-05-2019, 19:40
Не получилось запустить
если таки надо в cmd запускать именно, то: »
а свой вариант отрабатывает 52 компа и вылетает
Вот так примерно »
Нашел другой вариант решения net view \\имя компа , только не знаю как записать в переменную 3-ю строчку
C:\WINDOWS\system32>net view \\k140
Общие ресурсы на \\k140
УМКК;АБК;6 этаж;УИТ (Scada)
Имя общего ресурса Тип Используется как Комментарий
-------------------------------------------------------------------------------
slProject Диск
Команда выполнена успешно.
Не получилось запустить »
Проверяйте напрямую из powershell, но с учетом -ThrottleLimit, по умолчанию этот параметр равен 32
Specifies the maximum number of concurrent connections that can be established to run this command. If you omit this parameter or enter a value of 0, the default value, 32, is used.
Список машин не обязательно перечислять в строке, можно вынести в файл, а в строку запуска добавить чтение из файла:
icm -comp (gc machines.txt) -scr {(gwmi win32_operatingsystem).description}} -thrott 100
файл положить рядом со скриптом, а перечисление оформить по одной машине на строку...
А, да, совсем забыл, там ведь:
To create a PSSession or run commands on a remote computer, by default, the current user must be a member of the Administrators group on the remote computer. Credentials are sometimes required even when the current user is logged on to an account that is a member of the Administrators group.
и
If the current user is a member of the Administrators group on the remote computer, or can provide the credentials of a member of the Administrators group, use the Credential parameter of the New-PSSession, Enter-PSSession or Invoke-Command cmdlets to connect remotely.
Поэтому придется организовывать что-то вроде:
icm -comp SRV -cred SRV\Admin -scr {(gwmi win32_operatingsystem).description}}
В общем, не всё так просто с безопасностью...
Ну а раз уж:
Нашел другой вариант решения net view \\имя компа , только не знаю как записать в переменную 3-ю строчку »
то можно так:
@echo off
for /f "delims=" %%a in ('type machines.txt') do set pc=%%a&call :out
pause&exit /b
:out
for /f "skip=2 delims=" %%b in ('net view \\%pc%') do set var=%%b&goto next
:next
echo %pc% - %var%
exit /b
machines.txt - список машин, по одной на строку
Arsenik77
31-05-2019, 07:53
Вообщем из всех вариантов толком не работает ни один .
Остался последний вариант создание руками списка с помощью команды net view и выборка компьютера и "заметки с описанием" из этого файла.
C:\WINDOWS\system32>net view
Имя сервера Заметки
-------------------------------------------------------------------------------
\\K10 УМКК;АБК;7 этаж;Сбыт
\\K100 УМКК;АБК;6 этаж;УИТ
Примечание имена компьютеров простое K1, K2 .. K317
Основной батник запускаю в Windows Server 2012R2, а тестирую на Win10, поэтому получается тут работает , там не работает.
создание руками списка »
Сделайте выборку из AD.
из всех вариантов толком не работает ни один »
Если бы Вы хоть показали, что именно не работает, то возможно, Вам подсказали бы, как поправить... а так, лимит телепатии исчерпан пока, восполнить - проблематично. :)
имена компьютеров простое K1, K2 .. K317 »
можно организовать цикл, генерирующий имена компьютеров:
for /l %%i in (1,1,317) do echo K%%i
- и использовать эти имена вместо списка...
Arsenik77
31-05-2019, 15:21
На самом деле получил много полезных вариантов. :)
Просто выбрал самый простой и рабочий
for /f %%i in ("%pc%;") do (
findstr /c:%%i COMP.txt >tc.log
)
for /f "usebackq tokens=* delims=" %%a in ("tc.log") do (set var=%%~a)
где COMP.txt такого вида
\\K147;АБК;7 этаж;Лаборатория
\\K148;АБК;7 этаж;Сбыт
\\K150;АБК;6 этаж;ОТиЗ
и формируется командой net view и ручным редактированием
и рабочий »
ой ли ...
for /f %%i in ("%pc%;") do »
при наличии пробела в %pc% опять же получите бяку
мне вообще интересно: Каким-то чуднЫм образом получаем COMP.txt, первой строкой кода не менее чуднЫм образом практически просто переписываем COMP.txt в tc.log, а вот зачем еще в переменную брать последнюю строку этого файла вообще неясно. Или это все нагромождение идет для одной строки относительно одного запроса, тогда где автоматизация, смысл тогда какой?
Arsenik77,
вам не это ли надо случайно?
\\K147;АБК;7 этаж;Лаборатория
\\K148;АБК;7 этаж;Сбыт
\\K150;АБК;6 этаж;ОТиЗ
Код с запросом по имени компа, например: K148
@echo off
echo Введите имя компа:& set /p comp=
<COMP.txt (for /f "tokens=2* delims=\;" %%a in ('find "%comp%"') do @echo %%a;%%b)
pause
в переменную или другой файл так:
@echo off
echo Введите имя компа:& set /p comp=
:: В переменную
<COMP.txt (for /f "tokens=2* delims=\;" %%a in ('find "%comp%"') do set "var=%%a;%%b")
:: Запись в другой файл
<COMP.txt>file.txt (for /f "tokens=2* delims=\;" %%a in ('find "%comp%"') do @echo %%a;%%b)
pause
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.