我使用Powershell V3和/或Powershell V4 自从我处理此问题以来已经过了几天,但到目前为止还没有解决方案。
我解释一下,我有一个带有输入文件(服务器列表)的庸俗的Powershell,我希望通过循环foreach在其上进行处理,并在csv中检索输出。
但是,该循环似乎有效,在100行的输入文件中,只有最后一个是导出的(以前的出现被覆盖了),这是我不知道的原因。我已经尝试过通过增加变量来重新调整脚本(请参见下面的代码),但是没有成功。
能帮我解决这个问题吗?
enter code here Code1
# Emplacement fichierSource
$fileComputerNames = "E:\ReportXplanif\ServeursIUCR2K12.txt"
# Write-Host $fileComputerNames
# Emplacement fichierDestination
$desti = "E:\ReportXplanif"
# Write-Host $desti
Foreach ($server in Get-Content $fileComputerNames) {
$cmde = {Get-ScheduledTask | Where {$_.Principal.userid -eq "ZRES\XPLANIF"} | Get-ScheduledTaskInfo}
Invoke-Command -ComputerName $server -ScriptBlock $cmde |
Select @{LABEL='Serveur';EXPRESSION={$server}}, TaskName,LastRunTime,NextRunTime
}
Export-csv ($desti + "\XplanifTasks.csv") -Delimiter "," -NoTypeInformation
code2
# Emplacement fichierSource
$fileComputerNames = "E:\ReportXplanif\ServeursIUCR2K12.txt"
# Write-Host $fileComputerNames
# Emplacement fichierDestination
$desti = "E:\ReportXplanif\"
# Write-Host $desti
$cmde = @()
Foreach ($server in Get-Content $fileComputerNames) {
$cmde += {Get-ScheduledTask | Where {$_.Principal.userid -eq "ZRES\XPLANIF"} | Get-ScheduledTaskInfo}
Invoke-Command -ComputerName $server -ScriptBlock $cmde |
Select @{LABEL='Serveur';EXPRESSION={$server}}, TaskName,LastRunTime,NextRunTime
}`enter code here`
$cmde | Export-csv ($desti + "\XplanifTasks.csv") -Delimiter "," -NoTypeInformation`enter
答案 0 :(得分:1)
代码本身有一些有趣的地方。
$cmde
。为$fileComputerNames
中的每个服务器添加一个脚本块,即使这些脚本块不是特定于服务器的。 (Invoke-Command
是否接受脚本块数组?我希望它会出错)$cmde
用管道传输到Export-CSV
+=
构建数组没有错,但在PowerShell中效率非常低,如果数组太大,则应避免使用它,因为这会大大降低脚本运行速度。我无法完全审查您的尝试,但是假设您的Invoke Command
是否在您希望在一台计算机上进行的操作适合您。
...
$cmde = {Get-ScheduledTask | Where {$_.Principal.userid -eq "ZRES\XPLANIF"} | Get-ScheduledTaskInfo}
$SchTasks = Foreach ($server in Get-Content $fileComputerNames) {
Invoke-Command -ComputerName $server -ScriptBlock $cmde |
Select @{LABEL='Serveur';EXPRESSION={$server}}, TaskName,LastRunTime,NextRunTime
}
$SchTasks | Export-csv ($desti + "\XplanifTasks.csv") -Delimiter "," -NoTypeInformation
答案 1 :(得分:1)
我很想使用Task Scheduler com对象来执行此操作,这样我就不必在所有计算机上创建远程会话,只需连接到它们的Task Scheduler服务即可。这确实要求您在防火墙中启用对计划任务的远程管理,但是如果您允许远程Powershell,则可能也允许这样做。
$Scheduler = New-Object -ComObject Schedule.Service
Get-Content $fileComputerNames -PipelineVariable 'Server' |ForEach-Object{
$i=0
# Try to connect to remote task scheduler up to 3 times
While(!$Scheduler.Connect($Server) -eq 0 -or $i -eq 3){$i++}
# If we aren't connected to the right server throw a warning and move on to the next server
If(!$Scheduler.TargetServer -eq $Server){Write-Warning "Unable to connect to $Server"; Continue}
$RootFolder = $Scheduler.GetFolder('\')
$RootFolder.GetTasks(1) | # The '1' indicates we want to include hidden tasks
Where {$_.Principal.userid -eq "ZRES\XPLANIF"} |
Select @{LABEL='Serveur';EXPRESSION={$server}}, Name, LastRunTime, NextRunTime
} | Export-Csv "$desti\XplanifTasks.csv" -Del ',' -NoType