问题描述
我正在使用此脚本以正确的方式从RD服务器中删除损坏的配置文件。我想知道是否可以让脚本要求清除配置文件名称,而不是手动在脚本中键入。
Get-CimInstance -ComputerName servername1,servername2,servername3 -Class Win32_UserProfile |
Where-Object { $_.LocalPath.split('\')[-1] -eq 'profilenametocleanup' } |
Remove-CimInstance
该脚本运行良好,还可以删除损坏的注册表项。我希望我们的Servicedesk能够使用它,所以使它变得更加业余友好将是很棒的。
谢谢!
解决方法
绝对!您只需要将变量值'profilenametocleanup'
替换为变量引用即可!
PowerShell中的变量的定义和分配方式如下:
$username = "Some value or expression goes here"
要提示用户输入字符串值,我们可以使用Read-Host
cmdlet:
$username = Read-Host -Prompt "Enter the username of the profile to remove!"
然后,在现有管道中:
# replace the 'profiletocleanup' value with our variable instead
Get-CimInstance -ComputerName servername1,servername2,servername3 -Class Win32_UserProfile | Where-Object { $_.LocalPath.split('')[-1] -eq $username } | Remove-CimInstance
如果您想稍后在其他脚本中重用此管道,则最好将其重写为函数:
function Remove-RemoteUserProfile
{
param(
[string]$Username,[string[]]$ComputerName = @('servername1','servername2','servername3')
)
Get-CimInstance -ComputerName $ComputerName -Class Win32_UserProfile | Where-Object { $_.LocalPath.split('')[-1] -eq $Username } | Remove-CimInstance
}
现在,您可以使用同一命令定位任何用户或一组远程服务器:
# Will remove user profile for user jdoe on servername1 through 3
Remove-RemoteUserProfile -User "jdoe"
# Will remove user profile for user jdoe on servername1 and a machine called client5
Remove-RemoteUserProfile -User "bob" -ComputerName servername1,client5
# In this example we prompt the user for the username before calling the function:
$username = Read-Host -Prompt "Enter the username of the profile to remove!"
Remove-RemoteUserProfile -User $username -ComputerName someOtherComputer123
,
localpath并不总是与用户名完全匹配。使用sid更可靠。实际上,该对象由sid索引。
$user = 'admin'
$sid = Get-LocalUser $user | foreach { $_.sid.value }
get-wmiobject win32_userprofile | where sid -eq $sid | Remove-WmiObject -whatif
What if: Performing the operation "Remove-WmiObject" on target
"\\COMP001\root\cimv2:Win32_UserProfile.SID="S-2-6-31-4961843708-2576926490-3901110831-1002""