我在 PowerShell 和批处理文件中都有脚本,其中它将从一台计算机的根文件夹和子文件夹内删除超过 X 天的所有文件,但我正在寻找一个脚本,它将使用一个脚本从多个服务器中删除超过 X 天的文件。
下面是我在 PowerShell 和批处理文件中使用的代码
PowerShell 脚本:
Clear-Host
Set-ExecutionPolicy RemoteSigned
$Now = Get-Date
$Days = "30"
$TargetFolder = "C:\Older"
$Extension = "*.*"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-ChildItem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
{
if ($File -ne $NULL)
{
write-host "Deleting File $File" -ForegroundColor "DarkRed"
Remove-Item $File.FullName | out-null
}
else
{ Write-Host "No more files to delete!" -foregroundcolor "Green" }
}
批处理文件:
ForFiles /p "C:\Older" /s /d -30 /c "cmd /c del @file"
Pause
答案1
要使 PowerShell 逻辑从一个位置针对多个服务器运行,请确保启用PSRemoting在您要远程运行命令的每台服务器上运行。启用后,使用调用命令在远程服务器上运行 PowerShell 命令和其他可执行文件。
确保在每台服务器上启用 PSRemoting,方法是
Enable-PSRemoting -Force
通过组策略或启动脚本在每台服务器上运行一次,或者以您在环境中通常执行的任何方式执行此操作。创建一个要运行命令以进行清理的服务器列表,方法是将数组列表放入脚本逻辑或文本文件中,然后使用该列表通过以下方式创建数组获取内容。
因此对于服务器列表,两个选项是......
- 将服务器列表放入脚本本身中
$Servers = @("Server1","Server2.domain.com","Server4.otherdomain.com");
- 有一个包含服务器的文本文件,并
Get-Content
在脚本中使用它来获取列表
- 将服务器列表放入脚本本身中
脚本
Clear-Host
Set-ExecutionPolicy RemoteSigned
$Servers = @("Server1","Server2.domain.com","Server4.otherdomain.com");
###$Servers = Get-Content "\\Server\Share\Folder\Lists\ServerCleanupList.txt"
$Now = Get-Date
$Days = "30"
$TargetFolder = "C:\Older"
$Extension = "*.*"
$LastWrite = $Now.AddDays(-$Days)
$Servers | %{
Invoke-Command -ComputerName $_ -ScriptBlock {
$Files = Get-ChildItem $Using:TargetFolder -Include $Using:Extension -Recurse | Where {$_.LastWriteTime -le $Using:LastWrite}
$Files | %{If($_.FullName){$_.FullName | Remove-Item -Force}}
C:\Windows\System32\forfiles.exe /p "C:\Older" /s /d -30 /c "cmd /c del @file"
} -AsJob;
};
使用Invoke-Command
参数-AsJob
会在远程系统上将命令作为后台作业执行,然后对列表中的每个后续服务器执行相同的操作。
支持资源
- 启用PSRemoting
-
-ScriptBlock scriptblock
要运行的命令。
将命令括在花括号中
{ }
以创建脚本块。此参数是必需的。默认情况下,命令中的任何变量都会在远程计算机上进行评估。要在命令中包含局部变量,请
-ArgumentList
在 PowerShell 3.0+ 中使用或使用前缀$using:
在局部变量之前例如通过{ echo $using:mylocalVar }