我有一个奇怪的问题,我一直在这里工作。基本上我需要为符合特定条件的用户删除远程服务器上的配置文件夹。我不想删除服务器上的实际用户配置文件(注册表项被自动删除,配置文件文件夹应该是偶尔但有些卡住)所以wmi类不起作用,我只需要删除文件夹。
我已经彻底尝试了get-childitem |删除项目,但始终存在权限问题。我知道的唯一一件事就是rmdir / s / q,它涉及到一个命令提示符。我已经尝试过这几种方法,但到目前为止,我认为我最接近的是下面,我正在挂断的是尝试将$ Directory变量传递给命令提示符。我甚至在某个时刻深入研究过系统变量,但这确实无法正常工作,如果可能的话,我宁愿避免使用它。
Function Profile-Cleanup {
$Session = New-PSSession -ComputerName $Computer
Enter-PSSession $Session
Invoke-Command -Session $Session -ScriptBlock {
cd c:\Users\
$Directories = Get-ChildItem ("c:\Users") | Where-Object {(($_.Name -like "1*") -OR ($_.Name -like "2*") -OR ($_.Name -like "3*") -OR ($_.Name -like "*Temp*")) -and ($_.Name -notlike "a*") -and ($_.Name -notlike "b*") -and ($_.Name -notlike "C*")}
ForEach($Directory in $Directories){
Start-Process cmd -ArgumentList "rmdir /q /s" $Directory.Name ,"Exit" -Wait -Verb RunAs -PassThru
}
}
Exit-PSSession
Get-PSSession | Remove-PSSession
}
好的,谢谢@ gms0ulman将完整的命令绑定到变量是我需要的技巧。也感谢@postanote虽然我没有在这个脚本块中使用它,但是我将通过参数传递一次我可以解决它但是现在这是我的工作代码给其他任何有这个麻烦的人。
Function Profile-Cleanup {
$Session = New-PSSession -ComputerName $Computer
$actiongood = $True
Try {
Invoke-Command -Session $Session -ScriptBlock {
cd c:\Users\
$Computer = $env:COMPUTERNAME
$date = (get-date).ToString('MM-dd-yyyy')
$Directories = Get-ChildItem ("c:\Users") | Where-Object {(($_.Name -like "1*") -OR ($_.Name -like "2*") -OR ($_.Name -like "3*") -OR ($_.Name -like "*Temp*")) -and ($_.LastWriteTime -lt $date) -and ($_.Name -notlike "a*") -and ($_.Name -notlike "b") -and ($_.Name -notlike "c")}
ForEach($Directory in $Directories){
$process = "/c rmdir /q /s " + $Directory.Name
Start-Process cmd -ArgumentList $process, "Exit" -Wait -Verb RunAs
}
} -ErrorAction Stop
}Catch {
Write-Host "Unable to process Profile Cleanup on computer " $Computer " ...sorry" -ForegroundColor Red
$actiongood = $False
}
Get-PSSession | Remove-PSSession
If ($actiongood){
$FailedDirectories = Get-ChildItem ("\\"+ $Computer + "\C$\Users") | Where-Object {(($_.Name -like "1*") -OR ($_.Name -like "2*") -OR ($_.Name -like "3*") -OR ($_.Name -like "*Temp*")) -and ($_.LastWriteTime -lt $date) -and ($_.Name -notlike "a*") -and ($_.Name -notlike "n") -and ($_.Name -notlike "c")}
Write-Host "The following are the user profiles were unable to be fully deleted on " $Computer " likely because they were in use" -ForegroundColor Green
Write-Host "------------------------------------------------------------------" -ForegroundColor Green
Write-Host $FailedDirectories
Write-Host "------------------------------------------------------------------" -ForegroundColor Green
Write-Host "Starting Next Process" -ForegroundColor Blue -BackgroundColor Black
Write-Host "..." -ForegroundColor Blue -BackgroundColor Black
}
}
答案 0 :(得分:0)
至于你的主要目标......
将变量传递给远程计算机上的PowerShell
...这实际上取决于您使用的PoSH版本。以后的版本允许使用以下...
使用远程变量
Windows PowerShell假定远程命令中使用的变量 在命令运行的会话中定义。
在以下示例中,$ ps变量在临时中定义 运行Get-WinEvent命令的会话。
Invoke-Command -ComputerName S1 -ScriptBlock {$ ps =“Windows PowerShell“; Get-WinEvent -LogName $ ps}
同样,当命令在持久会话(PSSession)中运行时, 必须在同一PSSession中定义远程变量。
使用本地变量
您也可以在远程命令中使用局部变量,但必须这样做 表示该变量是在本地会话中定义的。
从Windows PowerShell 3.0开始,您可以使用“使用范围” 用于标识远程命令中的局部变量的修饰符。
使用的语法如下:
语法为:$ Using:
在以下示例中,$ ps变量在本地创建 session,但在命令运行的会话中使用。该 使用scope修饰符将$ ps标识为局部变量。
在WINDOWS POWERSHELL 2.0中使用局部变量
您可以通过定义参数在远程命令中使用局部变量 用于远程命令并使用的ArgumentList参数 Invoke-Command cmdlet将局部变量指定为参数 值。
此命令格式在Windows PowerShell 2.0及更高版本上有效 Windows PowerShell的版本。
- 使用param关键字定义远程命令的参数。参数名称是不需要匹配的占位符 局部变量的名称。
- 使用命令中param关键字定义的参数。
- 使用Invoke-Command cmdlet的ArgumentList参数将局部变量指定为参数值。
例如,以下命令定义了$ ps变量 本地会话,然后在远程命令中使用它。该命令使用 $ log作为参数名称,局部变量$ ps作为其值。