redirigir la salida de la ruta de prueba a un archivo de texto

Resuelto 200mg asked hace 4 años • 2 respuestas

El archivo txt es solo un montón de rutas UNC. Estoy intentando obtener una lista de rutas UNC de este archivo de texto y colocarlas en otro archivo de texto después de validar la ruta de prueba. muestra las rutas validadas en la pantalla pero el archivo de texto no se completa.

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { write-host "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}
200mg avatar Mar 05 '20 01:03 200mg
Aceptado

Para complementar la útil respuesta de Zam con información general :

  • Write-Hostescribe en el host [1] (normalmente, la consola, también conocida como terminal), lo que omite el flujo de salida exitoso de PowerShell y, por lo tanto, no envía nada a través de la canalización .

    • Consulte la sección inferior de esta respuesta para saber cuándo Write-Hostes apropiado; en resumen: generalmente solo debe usarlo para resultados de solo visualización .
  • Write-Outputes el cmdlet apropiado para producir salida de datos , pero rara vez es necesario , porque puede confiar en el conveniente comportamiento de salida implícito de PowerShell , como se muestra en la respuesta de Zam y se explica en esta respuesta .


Además, su comando funcionará mucho mejor si simplemente canaliza la salida del comando %( ) como un todo a una sola llamadaForEach-Object Out-File , en lugar de llamar Out-File -Append a cada ruta de entrada .

En lugar de usarlo %con salida explícita condicional, puede implementar su comando de manera más elegante con el Where-Objectcmdlet:

Get-Content .\cfgpath.txt |
  Where-Object { Test-Path $_ } |
  Out-File -FilePath c:\temp\1.txt

También tenga en cuenta que para guardar cadenas en un archivo es más eficiente usarloSet-Content en lugar de
Out-File, aunque tenga en cuenta que en Windows PowerShell la codificación de caracteres de salida predeterminada difiere (ya no es una preocupación en PowerShell [Core] 6+, que de forma predeterminada no utiliza BOM). UTF-8); consulte esta respuesta para saber cuándo elegir qué cmdlet.

Por el contrario, Out-Filey >(su alias efectivo) usa el sistema de formato de PowerShell para escribir representaciones para visualización de cualquier objeto de entrada que no sea una cadena en el archivo de salida , de la misma manera que la salida se muestra en la pantalla de forma predeterminada.
En otras palabras: para guardar objetos en un archivo de una manera que sea adecuada para un procesamiento programático posterior , debe utilizar un formato de archivo estructurado , como CSV ( Export-Csv) o JSON ( ConvertTo-Json, combinado con Set-Content).


[1] En PowerShell 5.0 y versiones posteriores, Write-Hostahora escribe en una nueva secuencia, la secuencia de información (número 6), que de forma predeterminada se imprime en el host. Ver about_Redirection. Por lo tanto, una 6>redirección ahora técnicamente le permite enviar Write-Hostresultados a través de la canalización (aunque hacerlo no es una buena idea) o capturarlos/redireccionarlos; p.ej,
Write-Host hi 6>&1 | % { "[$_]" }. Tenga en cuenta que el tipo de objetos generados por esta redirección es System.Management.Automation.InformationRecord.

mklement0 avatar Mar 04 '2020 20:03 mklement0

Write-HostSolo escribe en la consola. Creo que lo que quieres existe Write-Output.

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { write-output "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}

Además, puedes omitir el Write-Outputy eso también funciona.

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}
Zam avatar Mar 04 '2020 18:03 Zam