如何将这些结果中的文本解析为单独脚本的参数?

如何将这些结果中的文本解析为单独脚本的参数?

我需要从运行命令时得到的结果中client_TargetText提取:AnotherTargetText_110953_140521whoami /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 运行:

  1. 让我们使用正确的开头和结尾的引号 ( "")。
  2. 我们还可以使用适当的环境变量:$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

相关内容