计划脚本不会将输出重定向到文件

时间:2016-02-23 10:37:51

标签: powershell scheduled-tasks powershell-v3.0 windows-server-2012-r2

我有两个类似的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换行符(: - !)的唯一特性。鉴于:

  1. 这两个脚本都使用Windows换行保存
  2. 两个脚本都使用Write-Host
  3. 生成输出

    什么可以解释第一个脚本 1 中的奇怪之处?

    1 )以下是​​代码:

    $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
        }
    }
    

1 个答案:

答案 0 :(得分:1)

Write-Host

可能不适合工作。 因为它被设计成直接将输出写入用户控制台(脚本主机)而不实际产生输出,例如重定向或管道。

对于编写您不想在日志中查看但仅在交互式会话中查看的调试,报告或进度输出非常有用。 或者来自内部函数的消息,不应该"返回"那条消息

尝试使用

Write-Output 

您希望脚本输出的所有内容。内部功能要小心。

http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/