预定脚本不会将输出重定向到文件
Scheduled script does not redirect output to file
我有两个类似的 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
生成输出
什么可以解释第一个脚本中的那些奇怪之处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
}
}
Write-Host
可能不是适合工作的工具。
由于它旨在直接将输出写入用户控制台(脚本主机)而不实际产生输出,例如重定向或管道。
这对于编写您不想在日志中看到但只希望在交互式会话中看到的调试、报告或进度输出非常有用。
或者对于来自内部函数的消息,那不应该 "return" 那条消息
尝试使用
Write-Output
对于您希望脚本输出的所有内容。从函数内部小心。
http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/
我有两个类似的 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
生成输出
什么可以解释第一个脚本中的那些奇怪之处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
}
}
Write-Host
可能不是适合工作的工具。 由于它旨在直接将输出写入用户控制台(脚本主机)而不实际产生输出,例如重定向或管道。
这对于编写您不想在日志中看到但只希望在交互式会话中看到的调试、报告或进度输出非常有用。 或者对于来自内部函数的消息,那不应该 "return" 那条消息
尝试使用
Write-Output
对于您希望脚本输出的所有内容。从函数内部小心。
http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/