Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Не преобразуется переменная в значение

Ответить
Настройки темы
PowerShell - Не преобразуется переменная в значение

Старожил


Сообщения: 254
Благодарности: 41

Профиль | Отправить PM | Цитировать


Итак есть скрипт:
Скрытый текст

#$ErrorActionPreference= 'silentlycontinue'
try{
Remove-item 'host-os.txt'
}
catch{}
$FormatEnumerationLimit=-1
#Set-PSDebug -Trace 1

For ($n=1; $n -le 254; $n++) {
$IP = ("172.168.55." + $n).ToString()
#write-Output $IP
write-Output $IP":" | Add-Content 'host-os.txt'
Try {
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP
$Error[0].InvocationInfo.line
# | Format-List -Property Caption,CSDVersion,InstallDate,OSArchitecture,SerialNumber
#| Add-Content 'host-os.txt'
}
Catch [Exception]{
write-Output $_.Exception|format-list -force
}
}


Я не понимаю почему в команде Get-WmiObject переменная $IP не преобразуется в значение.
Пробовал так:
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $($IP)
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP.ToString()
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName '172.16.55.$IP'

результат один: не воспринимает переменную $IP за переменную и не подставляет значение.
Второй вопрос, почему не срабатывает try, вывод:
"$Error[0].InvocationInfo.line" - "Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP"

а должно быть "Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName 172.16.55.1"

Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
At C:\Users\adm-maleev\Documents\scan_os_ver.ps1:14 char:4
+ Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerNam ...

т.е. в catch никогда не попадаем.

-------
MCSA -> MCSE


Отправлено: 14:22, 19-04-2017

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


1. Подставляет
2. Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP - должно быть,а не содежимое переменной
3. Если требуется исполнять код в catch, то добавить -ErrorAction Stop

Код: Выделить весь код
For ($n=1; $n -le 254; $n++) {
	$IP = "172.168.55.$n"
	Try {
		Write-Host "Connect to $IP" -ForeGround Yellow
		Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP -ErrorAction Stop
	}
	Catch {
		write-Output $_.Exception|format-list -force
	}
}
И чтобы убедиться:

PS (STA) > Trace-Command {Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP} -PSHost -Name ParameterBinding
...........................................
DEBUG: ParameterBinding Information: 0 : BIND arg [172.168.55.1] to parameter [ComputerName]

Последний раз редактировалось Kazun, 19-04-2017 в 14:47.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:38, 19-04-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Старожил


Сообщения: 254
Благодарности: 41

Профиль | Отправить PM | Цитировать


Тогда я что-то не понимаю. Запускаю Ваш скрипт, получаю:
Скрытый текст

PS C:\Users\adm\Documents> C:\Users\adm\Documents\test1.ps1
Connect to 172.168.55.8


ErrorCode : -2147023174
Message : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
Data : {}
InnerException :
TargetSite : Void Start()
StackTrace : at System.Management.ThreadDispatch.Start()
at System.Management.ManagementScope.Initialize()
at System.Management.ManagementObjectSearcher.Initialize()
at System.Management.ManagementObjectSearcher.Get()
at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing()
HelpLink :
Source : System.Management
HResult : -2147023174



Connect to 172.168.55.9


ErrorCode : -2147023174
Message : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
Data : {}
InnerException :
TargetSite : Void Start()
StackTrace : at System.Management.ThreadDispatch.Start()
at System.Management.ManagementScope.Initialize()
at System.Management.ManagementObjectSearcher.Initialize()
at System.Management.ManagementObjectSearcher.Get()
at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing()
HelpLink :
Source : System.Management
HResult : -2147023174


По данным IP компьютеры включены и доступны, если выполнить обращение вручную.

Debug:
Скрытый текст

Connect to 172.168.55.8
DEBUG: 5+ >>>> Trace-Command {Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2
-ComputerName $IP} -PSHost -Name ParameterBinding
DEBUG: 5+ Trace-Command >>>> {Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2
-ComputerName $IP} -PSHost -Name ParameterBinding
DEBUG: 5+ Trace-Command { >>>> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2
-ComputerName $IP} -PSHost -Name ParameterBinding
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Get-WmiObject]
DEBUG: ParameterBinding Information: 0 : BIND arg [Win32_OperatingSystem] to parameter [Class]
DEBUG: ParameterBinding Information: 0 : COERCE arg to [System.String]
DEBUG: ParameterBinding Information: 0 : Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 : BIND arg [Win32_OperatingSystem] to param [Class] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND arg [root/cimv2] to parameter [Namespace]
DEBUG: ParameterBinding Information: 0 : COERCE arg to [System.String]
DEBUG: ParameterBinding Information: 0 : Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 : BIND arg [root/cimv2] to param [Namespace] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND arg [172.168.55.8] to parameter [ComputerName]
DEBUG: ParameterBinding Information: 0 : COERCE arg to [System.String[]]
DEBUG: ParameterBinding Information: 0 : Trying to convert argument value from System.String to
System.String[]
DEBUG: ParameterBinding Information: 0 : ENCODING arg into collection
DEBUG: ParameterBinding Information: 0 : Binding collection parameter ComputerName: argument type [String],
parameter type [System.String[]], collection type Array, element type [System.String], coerceElementType
DEBUG: ParameterBinding Information: 0 : Creating array with element type [System.String] and 1 elements
DEBUG: ParameterBinding Information: 0 : Argument type String is not IList, treating this as scalar
DEBUG: ParameterBinding Information: 0 : COERCE arg to [System.String]
DEBUG: ParameterBinding Information: 0 : Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 : Adding scalar element of type String to array position 0
DEBUG: ParameterBinding Information: 0 : Executing VALIDATION metadata:
[System.Management.Automation.ValidateNotNullOrEmptyAttribute]
DEBUG: ParameterBinding Information: 0 : BIND arg [System.String[]] to param [ComputerName] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Get-WmiObject]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-WmiObject]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Out-Default]
DEBUG: ParameterBinding Information: 0 : PIPELINE object TYPE = [System.Management.Automation.ErrorRecord]
DEBUG: ParameterBinding Information: 0 : RESTORING pipeline parameter's original values
DEBUG: ParameterBinding Information: 0 : Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION
DEBUG: ParameterBinding Information: 0 : BIND arg [The RPC server is unavailable. (Exception from HRESULT:
0x800706BA)] to parameter [InputObject]

DEBUG: ParameterBinding Information: 0 : BIND arg [The RPC server is unavailable. (Exception from HRESULT:
0x800706BA)] to param [InputObject] SUCCESSFUL

-------
MCSA -> MCSE


Последний раз редактировалось MaleyDarc, 19-04-2017 в 14:59.


Отправлено: 14:50, 19-04-2017 | #3


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


То что 172.168.55.8 и 172.168.55.9 - включены, это не значит что корректно настроен firewall, работают требуемые службы и т.д.

По данным IP компьютеры включены и доступны, если выполнить обращение вручную. - Чтобы не быть голословным, что вручную все работает замечаетельно, прилагайте скриншот, где показано выполнение команд:
Код: Выделить весь код
whoami /user
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName 172.168.55.8,172.168.55.9

Отправлено: 15:00, 19-04-2017 | #4


Старожил


Сообщения: 254
Благодарности: 41

Профиль | Отправить PM | Цитировать


Мои искренние извинения за потраченное время. Нашел ошибку. Адреса 172.16.*, а не 172.168.*!
Вот что значит не внимательность. Узнал для себя "глубины дебага".

Тогда наверное последний вопрос. Почему в файл попадает тип объекта, а не его значение:
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName $IP -ErrorAction Stop | Format-List -Property Caption, CSDVersion, InstallDate, OSArchitecture, SerialNumber | Add-Content 'host-os.txt'

В файле:
Скрытый текст

172.16.55.8:
Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
Microsoft.PowerShell.Commands.Internal.Format.GroupEndData
Microsoft.PowerShell.Commands.Internal.Format.FormatEndData

-------
MCSA -> MCSE


Отправлено: 15:11, 19-04-2017 | #5


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Использовать: Out-File -Append
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:19, 19-04-2017 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Не преобразуется переменная в значение

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Не конвертируется системная переменная %SystemRoot% в значение, при выгрузке скриптом 8ash8 Скриптовые языки администрирования Windows 4 17-02-2016 09:44
Нужна переменная которая передает значение каталога, в котором находится скрипт valdemarru Вебмастеру 0 24-03-2013 02:19
Загрузка - XP SP3. Значение «громкость» сбрасывается в среднее значение при перезагрузке. mitkadritka Microsoft Windows 2000/XP 9 24-02-2012 20:37
CMD/BAT - [решено] Удаление параметра в реестре где значение переменная RoNiBu Скриптовые языки администрирования Windows 8 24-02-2012 19:18
CMD/BAT - [решено] Два файла - как одна переменная, переменная - как параметр taravasya Скриптовые языки администрирования Windows 6 16-02-2010 04:49




 
Переход