es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo usar tar y tee en PowerShell para hacer una copia de archivo crudo de lectura única y escritura múltiple?

Estoy usando una computadora portátil pequeña para copiar archivos de video en el lugar a múltiples memorias USB (~8GB).
La copia debe hacerse sin supervisión una vez que se inicie y debe ser rápida.

He identificado un límite serio de velocidad, que cuando se hacen varias copias (por ejemplo, 4 sticks, de 2 cámaras, es decir, 8 transferencias * 8Gb) las múltiples lecturas utilizan mucho ancho de banda, especialmente porque las cámaras tienen interfaz USB2.0 (dos puertos) y capacidad limitada.

Si tuviera Unix, podría usar tar -cf – | tee tar -xf /stick1 | tee tar -xf /stick2 etc.
lo que significa que solo tendría que hacer 1 copia (2*8Gb) de cada cámara una vez, en la interfaz USB2.0.

Las memorias USB generalmente están en un concentrador en la única interfaz USB3.0 que se maneja en un canal diferente, por lo que se escriben suficientemente rápido.

Por razones, tengo que usar el actual PowerShell de Win10.

Actualmente estoy escribiendo todo el comando en una cadena (concatenando las diferentes fuentes y los diferentes destinos) y luego usando Invoke-Process para ejecutar el proceso de copia mientras estoy divirtiéndome y comprando rondas en el pub después de la filmación (de ahí la necesidad de estar afk).

Puedo tar cf – | tar xf un solo archivo, pero no puedo hacer que tee funcione correctamente.

También puedo usar con éxito la ranura para microSD para hacer la tarjeta de una sola cámara, lo cual no es tan agradable físicamente pero es rápido en una de las grabaciones de cámaras, pero aún tengo el problema de ancho de banda en las cámaras restantes. Podríamos terminar con 4-5 cámaras fuente al mismo tiempo, lo que significa que la lectura una vez, escribir muchas veces, seguirá siendo un problema.

Edición: Acabo de avanzar para jugar con Get-Content -raw | tee \stick1\f1 | tee \stick2\f1 | out-null. Aún no he hecho tiempos o verificación de archivos.

Edición 2: Parece que Get-Content -raw funciona correctamente, pero la funcionalidad de las tuberías de PowerShell viola dos de los mandamientos fundamentales de la programación: Un programa debe hacer una cosa y hacerlo bien, no debes meterte con la transmisión de datos.
Por alguna razón desconocida, el comportamiento de la tubería predeterminada (y única) de PowerShell siempre modifica la transmisión de datos que se supone que debe transferir de un flujo al siguiente. No parece tener una opción -raw ni parece tener una variable $session o $global que pueda configurar para remediar la mutilación.

¿Cómo transfieren los usuarios de PowerShell datos binarios sin procesar de un flujo a otro proceso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en PowerShell y en la entrada y salida de archivos, la copia de archivos de video en varias memorias USB (~ 8GB) sin supervisión y de manera rápida se puede lograr utilizando las siguientes opciones:

    1. Use el comando Robocopy. Este comando está disponible en todas las versiones de Windows y es una excelente herramienta para copiar archivos grandes. Es más rápido y proporciona más control sobre el proceso de copia. Una ventaja de Robocopy es su capacidad para reanudar el proceso de copia si se interrumpe.
    2. Use el cmdlet Copy-Item. Si Robocopy no está disponible, use el cmdlet PowerShell integrado, Copy-Item. Este cmdlet admite el parámetro -Recurse, lo que significa que copiará todos los archivos y subdirectorios desde la fuente hasta el destino.

    3. Use PowerShell Pipeline con Tee. La canalización de PowerShell también se puede usar para copiar archivos, pero para garantizar la transferencia binaria sin procesar, es mejor usar el cmdlet Tee-Object. Esto transferirá el flujo original sin modificar al siguiente proceso.

    Por ejemplo, el comando sería algo así:

    Get-Content -Raw .\source_video.mp4 | Tee-Object -FilePath .\destination1\destination_video.mp4 | Tee-Object -FilePath .\destination2\destination_video.mp4 | Tee-Object -FilePath .\destination3\destination_video.mp4
    

    Este comando leerá el archivo de video en la memoria, enviará los datos sin procesar exactos al primer destino y, luego, Tee enviará los mismos datos sin modificar a las ubicaciones restantes de destino.

    En resumen, las mejores opciones para copiar archivos grandes de video sin supervisión y de manera rápida incluyen el comando Robocopy, el cmdlet Copy-Item, y PowerShell Pipeline con el cmdlet Tee-Object.

Comments are closed.