redirigir la salida de la ruta de prueba a un archivo de texto
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 }
}
Para complementar la útil respuesta de Zam con información general :
Write-Host
escribe 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-Host
es apropiado; en resumen: generalmente solo debe usarlo para resultados de solo visualización .
- Consulte la sección inferior de esta respuesta para saber cuándo
Write-Output
es 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-Object
cmdlet:
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-File
y >
(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-Host
ahora 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-Host
resultados 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
.
Write-Host
Solo 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-Output
y eso también funciona.
$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
if (Test-Path $_) { "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}