我正在编写一个脚本(最好是 powershell),它基本上是从一堆 PC 复制一个文件并通过 FTP 将其发送到服务器。
因此,环境的结构是,我们在多台 PC(大约 50 台左右)上有一个文件,需要将其放在服务器上。有时其中一台 PC 可能会关闭,因此脚本首先需要确保 PC 已启动并正在运行(可能是 ping 结果),然后需要进入该 PC 上的目录,从中取出文件,重命名文件,放入源目录,然后删除文件。命名约定并不重要,但日期/时间戳最简单。理想情况下,最好先将所有文件移动到源目录以节省 FTP 带宽,但由于文件将被命名为相同,因此必须在移动过程中重命名文件。移动而不是复制,因为目录需要为空,以便第二天可以重新创建文件。因此,一旦移动到源目录,现在需要将所有文件通过 FTP 发送到服务器进行处理。
完成所有这些后,我们需要知道列表中哪些 PC 没有响应,以便我们可以手动检索文件,因此脚本应该输出一个文件(txt 就可以),显示哪些 PC 处于离线状态。
一切都是一个域,并且脚本将从具有管理员凭证的服务器运行。
谢谢你!
答案1
編輯:
$down = "C:\Script\log\down-hosts.log"
$nofile = "C:\Script\log\no-file.log"
$computers = Get-Content "C:\Script\list\Computers.txt"
$TargetPath = "\\server\directory\directory\"
$SourceFileName = "file_name.csv"
foreach ($computer in $computers) {
if ( Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue
{
$sourcefilePath = "\\$computer\c$\UPS CSV Exports\$SourceFileName"
Write-Host "$computer is up"
Write-Host "Copying $SourceFilePath ..."
Try {
If (Test-Path $SourceFilePath) {
Move-Item $SourceFilePath "$TargetPath\$computer`_$SourceFileName" -force
} Else {
#Throw "$SourceFilePath does not exist"
Write-Host "$computer file does not exist"
"$computer $SourceFileName file does not exist" | Out-File $nofile -append
}
} Catch {
Write-Host "Error: $($Error[0].Exception.Message)"
}
} Else {
Write-Host "$computer is down"
"$computer is down $(get-date)" | Out-File $down -append
}
}
一些新的解释:
使用来
Test-Connection
测试主机是否启动(无 ping)。- 保留这个,因为它运行良好New-Item
没有必要使用。使用
Move-Item
代替 FTP 协议。添加了新的日志功能:
"$computer $SourceFileName file does not exist" | Out-File $nofile -append
提供第二个日志显示文件不存在。添加了新的日志功能:
"$computer is down $(get-date)" | Out-File $down -append
显示计算机已关闭,并标明日期/时间。