У меня есть два похожих сценария PowerShell для резервного копирования файлов (сначала очищает сетевой диск, второй делает реальную резервную копию), настроенный для ежедневной работы в одной задаче планировщика Windows (только разные действия):Запланированный скрипт не перенаправляет вывод в файл
Action: Start a program
Program/script: powershell.exe
Add arguments (optional): -command C:\Webs\Scripts\purgar-backups-dinahosting.ps1 > C:\Webs\Scripts\purgar-backups-dinahosting.log 2>&1
Action: Start a program
Program/script: powershell.exe
Add arguments (optional): -command C:\Webs\Scripts\backup-dynahosting.ps1 > C:\Webs\Scripts\backup-dynahosting.log 2>&1
Я получаю ожидаемые файлы журнала, но первый всегда пуст (0 байт). Я получить фактический выход, если я просто запустить команду из командной строки:
powershell.exe -command C:\Webs\Scripts\purgar-backups-dinahosting.ps1 > C:\Webs\Scripts\purgar-backups-dinahosting.log 2>&1
... с той лишь особенностью, что она использует Unix линии питает (: -!). Учитывая, что:
- Оба сценария сохраняются в строке Windows, каналы
- Оба сценария генерируют выходной сигнал с
Write-Host
Что может объяснить эти странности в первом сценарии ?
() Вот код:
$LetraUnidad = "X:"
$RecursoNFS = "xxx_removed_xxx.dinaserver.com:/usr/containers/xxx_removed_xxx"
$EspacioContratado = "xxx_removed_xxx"
$LimitePorcentaje = "xxx_removed_xxx"
Write-Host "Verificando si ya está montada la unidad de red en $LetraUnidad..."
$UnidadRed = New-Object System.IO.DriveInfo($LetraUnidad)
if ($UnidadRed.IsReady)
{
Write-Host "Unidad de red disponible"
}
else
{
Write-Host "Unidad de red no disponible, montando unidad..."
net use $LetraUnidad $RecursoNFS
if ($UnidadRed.IsReady)
{
Write-Host "Unidad de red disponible"
}
else
{
Write-Host "Se ha producido un error al intentar montar la unidad de red"
exit
}
}
Write-Host "Obteniendo datos de espacio de la unidad $LetraUnidad..."
$EspacioOcupado = ((Get-ChildItem $LetraUnidad -Recurse | Measure-Object -property length -sum).sum) /1gb
$EspacioLibre = $EspacioContratado-$EspacioOcupado
$PorcentajeEspacioOcupado = ($EspacioOcupado*100/$EspacioContratado)
Write-Host "Espacio total: " ([System.Math]::Round($EspacioContratado, 2)) " GB"
Write-Host "Espacio libre: " ([System.Math]::Round($EspacioLibre, 2)) " GB"
Write-Host "Espacio ocupado: " ([System.Math]::Round($EspacioOcupado, 2)) " GB"
Write-Host "Porcentaje ocupación: " ([System.Math]::Round($PorcentajeEspacioOcupado, 2))"%"
Write-Host
Write-Host "Comprobando si es necesario eliminar archivos..."
if($PorcentajeEspacioOcupado -gt $LimitePorcentaje)
{
Write-Host "Poco espacio disponible, eliminando archivos..."
}
else
{
Write-Host "Espacio disponible suficiente, no es necesario eliminar archivos"
exit
}
foreach ($file in Get-ChildItem -path X: | where-object{-not $_.PSIsContainer} | sort -property LastWriteTime)
{
Write-Host "Eliminando " $file.FullName
del $file.FullName
$EspacioOcupado = ((Get-ChildItem $LetraUnidad -Recurse | Measure-Object -property length -sum).sum) /1gb
$EspacioLibre = $EspacioContratado-$EspacioOcupado
$PorcentajeEspacioOcupado = ($EspacioOcupado*100/$EspacioContratado)
if($PorcentajeEspacioOcupado -lt $LimitePorcentaje)
{
Write-Host
exit
}
}
CMD интерпретируют '>' и '2> & 1 'как операторы перенаправления и обрабатывать их самостоятельно и не передавать их в PowerShell. Планировщик задач интерпретирует аргументы как литерал. Таким образом, '>' и '2> & 1' будут переданы в PowerShell и будут обработаны PowerShell. И PowerShell знает, что поток хоста не должен перенаправляться оператором '>'. – PetSerAl
@PetSerAl Спасибо за головы. Я никогда не понимал, почему или когда мне нужно разделить свои действия в трех (крошечных) текстовых полях; эти настройки были фактически результатом некоторой охоты на мусорщиков Google. Какой был бы правильный способ запустить * .ps1 и отправить его вывод в файл? –
Одним из способов, который не требует изменения скриптов, будет: * program: * 'cmd' и * arguments: *'/c powershell -command C: \ Webs \ Scripts \ backup-dynahosting.ps1> C: \ Webs \ Scripts \ backup-dynahosting.log 2> & 1'. – PetSerAl