1

我有兩個類似的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

輸出,怎麼能在第一個腳本解釋這些古怪?

()下面的代碼:

$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

CMD解釋'>'和'2>&1'作爲重定向操作符,並通過自身處理它們,並且不把它們傳遞給PowerShell的。任務調度程序將參數解釋爲文字字符串。因此,'>'和'2>&1'將被傳遞給PowerShell,並且將由PowerShell處理。 PowerShell知道,主機流不應該被'>'運算符重定向。 – PetSerAl

+0

@PetSerAl感謝您的支持。我從來沒有真正理解爲什麼或何時需要在三個(小)文本框中分割我的動作;這些設置實際上是一些谷歌搜索狩獵的結果。運行* .ps1並將其輸出發送到文件的正確方法是什麼? –

+1

的一種方式,它不需要你修改腳本是:*程序:*'cmd'和*參數:*'/ C的powershell -command C:\站點\腳本\備份dynahosting.ps1> C:\站點\ Scripts \ backup-dynahosting.log 2>&1'。 – PetSerAl

回答

1
Write-Host 

可能不適合這份工作的合適工具。由於它設計爲直接將輸出寫入用戶控制檯(腳本主機)而不實際產生輸出,例如重定向或管道。

它是用於編寫調試 - 非常有用,報告 - 或進度輸出,你不想在日誌中,但只有在交互式會話看到。 或者從內部功能的消息,不應該「迴歸」該消息

嘗試使用

Write-Output 

一切你想你的腳本輸出。從內部功能小心。

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

+0

就是這樣!不知道爲什麼其他腳本確實生成了正確的日誌文件,但說實話我不在乎:) –

+0

'>'告訴腳本宿主重定向腳本的輸出。它不是腳本本身的一部分。我可以想象,當你用不同的主機(powershell.exe vs windows sheduler)運行腳本時,重定向的工作方式不同。但不管它是什麼,它現在似乎工作。我會感謝你標記我的答案爲已驗證:) – Darcon

+0

噢,並在上面的評論中提出問題: 嘗試使用'開始 - 轉錄本-Append -Path $ logFile'。 – Darcon