我正在尝试将文件从C:\example
复制到D:\example\$version\
,我正在尝试从已安装服务的显示名称中获取$version
。
我想我需要做这样的事情,但我不知道如何只获得myservice的版本:
$version = Get-Service -DisplayName "myservice *"
copy-item "c:\example\*" "d:\example\$version\" -recurse
答案 0 :(得分:1)
这基本上取决于PowerShell如何使用“get”命令返回数据。请记住,“获取服务”不只是返回包含您的服务名称的字符串,而是返回有关该服务的收集数据的“对象”。
PS C:\storage\scripts> get-service -DisplayName "Windows Search"
Status Name DisplayName
------ ---- -----------
Running WSearch Windows Search
仅此一项就可以向您显示您的$ version变量不仅仅是服务的名称。您需要的是实际使用返回对象的DisplayName组件:
PS C:\storage\scripts> $version = get-service -DisplayName "Windows Search"
PS C:\storage\scripts> $version.DisplayName
Windows Search
希望这能让你顺利上路。
编辑:就实际服务版本而言,get-service不会扩展到该级别,但可以使用.NET调用从可执行文件中获取此内容:
PS C:\Program Files\7-Zip> [System.Diagnostics.FileVersionInfo]::GetVersionInfo("C:\Program Files\7-Zip\7z.exe").FileVersion
16.04
答案 1 :(得分:0)
假设您的服务名称的名称末尾有版本号,并且它与名称的其余部分用空格字符分隔,您可以这样做:
$ServiceName = (Get-Service -displayname "myservice *" | Select -Last 1).DisplayName
$Version = ($ServiceName -Split ' ')[-1]
copy-item "c:\example\*" "d:\example\$Version\" -recurse
<强>解释强>
Select -Last 1
以防多个匹配,以便按字母顺序获取最后一个(应该是最高版本)。-split
运算符将显示名称拆分为空格字符上的字符串数组,然后通过索引标识符-1
获取结果数组中的最后一项。答案 2 :(得分:0)
这是一个使用-replace
函数而不是拆分的完整示例:
$serviceName = 'myservice'
$version = (Get-Service -DisplayName "$serviceName*").DisplayName -replace "$serviceName\s*(.*)", '$1'
Copy-Item "c:\example\*" "d:\example\$version\" -recurse