我需要从运行命令时得到的结果中client_TargetText
提取:AnotherTargetText_110953_140521
whoami /groups
Powershell 结果:
Group Name Type SID Attributes
========================================== ================ ============================================= ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\INTERACTIVE Well-known group S-1-5-4 Mandatory group, Enabled by default, Enabled group
CONSOLE LOGON Well-known group S-1-2-1 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
LOCAL Well-known group S-1-2-0 Mandatory group, Enabled by default, Enabled group
MYDOMAIN\GGM-FIRE-PC Group S-1-5-21-457414007-2867176591-488352320-6061 Mandatory group, Enabled by default, Enabled group
MYDOMAIN\myles_gp Group S-1-5-21-457414007-2867176591-488352320-12531 Mandatory group, Enabled by default, Enabled group
MYDOMAIN\GGM-RDP Group S-1-5-21-457414007-2867176591-488352320-13873 Mandatory group, Enabled by default, Enabled group
MYDOMAIN\client_TargetText Group S-1-5-21-457414007-2867176591-488352320-7924 Mandatory group, Enabled by default, Enabled group
MYDOMAIN\AnotherTargetText_110953_140521 Group S-1-5-21-457414007-2867176591-488352320-13947 Mandatory group, Enabled by default, Enabled group
Authentication authority asserted identity Well-known group S-1-18-1 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
PS C:\Users\test.dev>
我该如何抓取client_TargetText
和删除它client_
,使其变得公正TargetText
,然后$Param1
在下面的脚本中做到这一点?(client_
始终存在于我需要抓取 $Param1 的文本中)
那么我该如何抓取AnotherTargetText_110953_140521
以便可以将其制作成$Param2
下面的脚本?(在这些 AD 组中,所需的文本$Param2
始终以 为后缀)6digits_6digits
我的目标是以某种方式将该文本发送到我用于在用户桌面上创建服务器快捷方式的脚本中。
运行时,每个用户的结果都会有所不同,whoami
因此我认为唯一可以使用的通配符是client_
和6digits_6digits
。任何帮助我找到这个答案的人都非常感谢,因为我正在尝试了解它将如何工作,但无法弄清楚。
下面的脚本是成功解析这两段文本并将其转换为$Param1
和之后的期望结果$Param2
:
function set-shortcut {
param ( [string]$SourceLnk, [string]$DestinationPath )
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($SourceLnk)
$Shortcut.TargetPath = $DestinationPath
$Shortcut.Save()
}
try{
$Param1 = TargetText
$Param2 = AnotherTargetText_110953_140521
$SourcePath = \\server\data\designs\$Param1\$Param2\data_store"
set-shortcut "%USERPROFILE%\Desktop\data_store.lnk" "$SourcePath"
"This worked"
pause
}
catch
{
"This didn't work"
}
pause
答案1
如果使用 PowerShell 运行:
- 让我们使用正确的开头和结尾的引号 (
""
)。 - 我们还可以使用适当的环境变量:
$env:USERPROFILE
。
我真的不太明白你试图完成什么,所以我按照你的意思做了。至于你函数的参数,我仍然不明白。
function Set-ShortCut {
Param (
[string]$SourceLnk,
[string]$DestinationPath
)
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($SourceLnk)
$Shortcut.TargetPath = $DestinationPath
$Shortcut.Save()
}
$Groups = Whoami /Groups /FO CSV | ConvertFrom-Csv
$Param1, $Param2 = $Groups.'Group Name'.Where{
$_ -match 'client_' -or `
$_ -match '(_\d{6}){2}'
} -replace 'client_|MYDOMAIN\\'
$SourcePath = "\\server\data\designs\$Param1\$Param2\data_store"
Set-ShortCut -SourceLnk "$env:USERPROFILE\Desktop\data_store.lnk" -DestinationPath $SourcePath
幸运的是,whoami
有一个/FO CSV
选项,我们可以使用它将其转换为正确的 PowerShell 对象ConvertFrom-Csv
。对象转换后,我们可以使用一些正则表达式匹配以获得您想要的结果,假设名称正是如此显示。请注意 和 的双重赋值$Param1
,$Param2
因为它将结果拆分为这两个变量。此外,在尝试避免管道,我用的是.Where()\{}
操作员(是的,它被认为是一个运算符) 以便更快地进行解析。
我建议研究@Lee_Daily 提到的 cmdlet,包括他提供的方法来获取您想要的结果。
编辑: 您可以尝试将过滤分为两个变量以进行显式过滤。虽然这不是最好的解决方案,但它应该有效:
function Set-ShortCut {
Param (
[string]$SourceLnk,
[string]$DestinationPath
)
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($SourceLnk)
$Shortcut.TargetPath = $DestinationPath
$Shortcut.Save()
}
$Groups = WhoAmI /Groups /FO CSV | ConvertFrom-Csv
$Param1 = $Groups.'Group Name'.Where{ $_ -match 'client_' } -replace 'client_|MYDOMAIN\\'
$Param2 = $Groups.'Group Name'.Where{ $_ -match '(_\d{6}){2}' } -replace 'MYDOMAIN\\'
$SourcePath = "\\server\data\designs\$Param1\$Param2\data_store"
Set-ShortCut -SourceLnk "$env:USERPROFILE\Desktop\data_store.lnk" -DestinationPath $SourcePath