【问题标题】:Subexpression printing out same strings? Powershell子表达式打印出相同的字符串?电源外壳
【发布时间】:2021-01-01 04:26:16
【问题描述】:

我有这段代码可以从远程机器上删除用户配置文件。删除配置文件效果很好,但是这样做的美感却不行。什么意思?

  • 我将用户显示名称传递给索引并从中进行选择,这可以很好地为 C:\users 中关联的相应索引号分配正确的名称。
  • 下一行代码是它抓取我所做的选择,并在它们中运行并显示我为索引所做的相同名称,然后删除 CIM 实例。

所以我的问题是,为什么它不传递已经创建的子表达式 $userinfo1 并且不将其放入下一个代码块中,例如,以下工作就像获取正确的显示名称并将其分配给正确的数字:

$menu = (get-childitem "\\$cn\c$\users"  | sort LastWriteTime -Descending).Name
$userinfo1 = foreach ($user in $menu) {
Start-Sleep -Milliseconds 2
  $userinfo = (net user $user /domain | Select-String "Full Name" -ErrorAction SilentlyContinue) -replace "Full Name                   ", "" 2>&1 | Out-String -Stream
  if ($userinfo.Length -lt 4) {    
    "$user - NO DISPLAY NAME in ADUC"  # output
  }
  else {
    if ($LASTEXITCODE -eq 2) {
      "$user   -   account not in ADUC"    # output
    }
    else {
    if ($LASTEXITCODE -eq 0){
      $userinfo  # output
        }
      }
    }
}
        Write-Warning "Ensure user profiles are no longer active and/or, have profiles be backed-up!"
            Write-Host "RESULTS:" -BackgroundColor Black -ForegroundColor White 
for ($i=0; $i -lt $userinfo1.Count; $i++) {
  Write-Host "$($i): $($userinfo1[$i])"
} #END LIST OF POSSIBLE NAMES 
             Write-Host ""
            Write-Host "For multiple users, seperate using a SPACE(1 2 3)" 
        $selection = Read-Host "ENTER THE NUMBER of the user(s) or Q to quit"
        $selection = $selection -split " "

但是,下一个块将显示名称(在$userinfo1 中捕获)与我选择的数字相关联,它只是继续显示第一个显示名称和其余部分其重申的配置文件:

foreach($Profile in $menu[$selection]){
    Write-Host "Deleting user: $(,$userinfo1[$selection]) `
                ID:$Profile "}

希望这是有道理的,如果有人能指出我正确的方向,我将不胜感激!

这是脚本的其余部分,请随意使用它,因为它确实可以从系统中删除实际配置文件,而不仅仅是文件。

#Deletes a profile properly off remote machine.  WARNING: DOES NOT BACK UP DATA!  Use at your own peril. Delprofile
$cn =  Read-Host -Prompt "Enter Computer Name"

$ping = Test-Connection -ComputerName $cn -Count 1 -Quiet 

    If($ping -eq $false){ Write-Host "Computer seems to be offline, please check name spelling." -ForegroundColor DarkYellow; Write-Host ""; &PFL-Delete } else {

$menu = (get-childitem "\\$cn\c$\users"  | sort LastWriteTime -Descending).Name

$userinfo1 = foreach ($user in $menu) {
Start-Sleep -Milliseconds 2
  $userinfo = (net user $user /domain | Select-String "Full Name" -ErrorAction SilentlyContinue) -replace "Full Name                   ", "" 2>&1 | Out-String -Stream
  if ($userinfo.Length -lt 4) {    
    "$user - NO DISPLAY NAME in ADUC"  # output
  }
  else {
    if ($LASTEXITCODE -eq 2) {
      "$user   -   account not in ADUC"    # output
    }
    else {
    if ($LASTEXITCODE -eq 0){
      $userinfo  # output
        }
      }
    }
}


        Write-Warning "Ensure user profiles are no longer active and/or, have profiles be backed-up!"

            Write-Host "RESULTS:" -BackgroundColor Black -ForegroundColor White 

for ($i=0; $i -lt $userinfo1.Count; $i++) {

  Write-Host "$($i): $($userinfo1[$i])"

} #END LIST OF POSSIBLE NAMES 

             Write-Host ""

            Write-Host "For multiple users, seperate using a SPACE(1 2 3)" 

        $selection = Read-Host "ENTER THE NUMBER of the user(s) or Q to quit"

        $selection = $selection -split " "

foreach($Profile in $menu[$selection]){


    Write-Host "Deleting user: $(,$userinfo1[$selection]) `

                ID:$Profile "

   $del = Get-CimInstance -ComputerName $cn -Class Win32_UserProfile | Where-Object { $_.LocalPath.split('\')[-1] -eq $Profile }

   If($del -eq $null){Write-Warning "No CIM instance found on system, profile has been deleted but files persist. Delete manually!"} else{

   Get-CimInstance -ComputerName $cn -Class Win32_UserProfile | Where-Object { $_.LocalPath.split('\')[-1] -eq $Profile } | Remove-CimInstance -WhatIf

    Write-Host "user profile has been deleted" -ForegroundColor Red

     Write-Host ""}

        }
    }
    #CountPs $cn

2020 年 12 月 31 日 - 编辑: 这是完成的结果:

Function Delete-PFL{
#Deletes a profile properly off remote machine.  WARNING: DOES NOT BACK UP DATA!  Use at your own peril. Delprofile
$cn =  Read-Host -Prompt "Enter Computer Name"

$ping = Test-Connection -ComputerName $cn -Count 1 -Quiet 

    If($ping -eq $false){ Write-Host "Computer seems to be offline, please check name spelling." -ForegroundColor DarkYellow; Write-Host ""; &Delete-PFL } else {

$menu = (get-childitem "\\$cn\c$\users"  | sort LastWriteTime -Descending).Name

$userinfo1 = foreach ($user in $menu) {
Start-Sleep -Milliseconds 2
  $userinfo = (net user $user /domain | Select-String "Full Name" -ErrorAction SilentlyContinue) -replace "Full Name                   ", "" 2>&1 | Out-String -Stream
  if ($userinfo.Length -lt 4) {    
    "$user - NO DISPLAY NAME in ADUC"  # output
  }
  else {
    if ($LASTEXITCODE -eq 2) {
      "$user   -   ACCOUNT NOT in ADUC"    # output
    }
    else {
    if ($LASTEXITCODE -eq 0){
      $userinfo  # output
        }
      }
    }
}


        Write-Warning "Ensure user profiles are no longer active and/or, have profiles be backed-up!"

            Write-Host "RESULTS:" -BackgroundColor Black -ForegroundColor White 

for ($i=0; $i -lt $userinfo1.Count; $i++) {

  Write-Host "$($i): $($userinfo1[$i])"

} #END LIST OF POSSIBLE NAMES 

             Write-Host ""

            Write-Host "For multiple users, seperate using a SPACE(1 2 3)" 

        $selection = Read-Host "ENTER THE NUMBER of the user(s) or Q to quit"

        $selection = $selection -split " "


foreach($index in $selection) {
    $Profile = $menu[$index]
    Write-Host "Deleting user: $($userinfo1[$index]) `
                ID:$Profile "
  


   $del = Get-CimInstance -ComputerName $cn -Class Win32_UserProfile | Where-Object { $_.LocalPath.split('\')[-1] -eq $Profile }

   If($del -eq $null){Write-Warning "No CIM instance found on system, profile has been deleted but files persist."    
    Write-Host "Attempting to delete files, please wait. . ." 
     
     Remove-Item -Path "\\$cn\c$\users\$Profile" -Force -WhatIf       
     Write-Host ""
     
     Start-Sleep -Seconds 2
    Write-Host "Checking if Files are still there. . ."

$TestPath = Test-Path -Path "\\$cn\c$\users\$Profile"    
   If($TestPath -eq $false){ Write-Host "Profile Files have been deleted. `
   Continuing. . . ." -ForegroundColor Green
                 }
   } else{

   Get-CimInstance -ComputerName $cn -Class Win32_UserProfile | Where-Object { $_.LocalPath.split('\')[-1] -eq $Profile } | Remove-CimInstance -WhatIf

    Write-Host "user profile has been deleted" -ForegroundColor Red

     Write-Host ""
                
            }

        }
    }
    #CountPs $cn
}

记得删除-whatif 参数。享受吧!

【问题讨论】:

    标签: powershell


    【解决方案1】:

    $selection 是一个 array 索引,因此在您的 foreach 循环中,您必须引用手头的 single 索引,而不是 $selection整体,以获得所需的显示输出。

    概念上最清晰的方法可能是迭代 $selection 中包含的索引:

    foreach($index in $selection) {
        $Profile = $menu[$index]
        Write-Host "Deleting user: $($userinfo1[$index]) `
                    EDIPI:$Profile "
        # ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2023-03-19
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多