PowerShell调用Substring提取计算机名提示方法不存在如何解决
报错原因
报错核心是两点:
Select-Object Name不会返回Name属性的原始字符串值,而是生成一个仅携带Name属性的包装对象,类型为Selected.System.Management.ManagementObject,不属于字符串类型,自然没有字符串类专属的Substring()方法。- 即使拿到正确的字符串,
Substring(9,0)的第二个参数代表要截取的字符长度,传0只会返回空值,达不到截取效果。
正确写法
直接访问属性拿字符串值
直接通过对象属性访问拿到纯字符串格式的计算机名,再调用截取方法即可:
# 括号包裹命令后直接取Name属性,返回值为字符串类型 $compname = (Get-WmiObject -Class Win32_ComputerSystem).Name $compname # 从索引位置9开始截取到字符串末尾(PowerShell字符串索引从0开始计数) $compname.Substring(9) # 如果需要截取固定长度,比如从索引9开始截2个字符,写法为 $compname.Substring(9,2)
提示:
Get-WmiObject在PowerShell 5.1及以上版本已被标记为弃用,可替换为更安全的Get-CimInstance,写法为(Get-CimInstance -ClassName Win32_ComputerSystem).Name,返回结果完全一致。
用ExpandProperty参数展开属性
如果习惯用管道传递对象,给Select-Object加-ExpandProperty参数,就能直接输出属性的原始值,而非包装对象:
$compname = Get-WmiObject -Class Win32_ComputerSystem | Select-Object -ExpandProperty Name $compname $compname.Substring(9)
避坑说明
只要变量的类型名以Selected.开头,就代表这是Select-Object生成的包装对象,无法直接调用原始属性类型的方法,必须先取出属性对应的原始值再操作。Substring方法的第一个参数是截取起始索引(从0开始计数,不是从1开始),第二个参数为可选的截取长度,不传该参数时默认截取从起始位置到字符串结尾的所有内容。
内容的提问来源于stack exchange,提问作者Jonathan Blaine
相关产品推荐
相关产品推荐

