Estoy tratando de reescribir este script que usamos, (nombres de servidor editados), para resolver un problema en el trabajo.

:asc
if Exist \\SERVER01\import\process\*.asc (goto :SERVER02) ELSE (goto :process)
:SERVER02
if Exist \\SERVER02\import\process\*.asc (goto :end) ELSE (goto :process2)

:process
IF EXIST E:\import\*.asc (
goto :filefound) ELSE (goto :filenotfound)

:filefound
 FOR /f "delims=" %%a in ('dir "e:\import\*.asc" /t:a /o:d /b') do (
  echo %%a
  set file=%%a
goto :break
 )

 :break
 %file%
 robocopy e:\import\ \\SERVER01\import\process\ "%file%" /copy:DAT /mov
goto :end


:process2
IF EXIST E:\import\*.asc (
goto :filefound) ELSE (goto :filenotfound)

:filefound
 FOR /f "delims=" %%a in ('dir "e:\import\*.asc" /t:a /o:d /b') do (
  echo %%a
  set file=%%a
  goto :break2
 )

 :break2
 %file%
 robocopy e:\import\ \\SERVER02\import\process\ %file% /copy:DAT /mov
goto :end

:filenotfound
Echo There are no .asc files at this time)

:end
robocopy \\SERVER01\import\archive\ e:\import\archive\ /copy:DAT /is /mov /xx
robocopy \\SERVER02\import\archive\ e:\import\archive\ /copy:DAT /is /mov /xx

Originalmente, este script se configuró para equilibrar todos los archivos entre las dos aplicaciones de procesamiento dependiendo de si una ya tenía un archivo en el que estaba trabajando, se lo daría a la otra ... pero ahora necesito implementar una verificación en los nombres de los archivos y solo exporta ciertos rangos de letras a cada servidor de procesamiento. Así que supongo que esto significa que, en lugar de movernos uno a la vez, solo dividiremos todos los archivos .ASC que se encuentran actualmente en la carpeta del repositorio en ese momento y moveremos la mitad a un servidor y la mitad al otro ser recogido uno a la vez por la aplicación).

Tenemos archivos .ASC que incluyen datos para clientes (escritos en SQL usando una aplicación propietaria antigua). Se llaman CLIENTNAME.asc y tenemos alrededor de 200 clientes. El uso de este software o su funcionalidad no se puede cambiar, por lo que para acelerar el procesamiento de archivos, creamos dos servidores que ejecutan esa aplicación. Luego armé un pequeño script CMD que mira un repositorio central de esos archivos y los distribuye entre cada servidor como una especie de equilibrador de carga. El problema que hemos encontrado es que, si dos archivos para el mismo cliente se procesan al mismo tiempo (uno fue a un servidor para su procesamiento y otro al otro), causa un problema sobre cómo se importa a SQL.

Entonces, la solución en mi cabeza es que el script mueva todos los archivos .ASC que comienzan con A a O a un servidor, y los que comienzan con L a { {X4}} ir al otro. Luego jugaría con esos rangos de letras para asegurarme de que las cosas estén equilibradas correctamente. Esto significaría que todos los archivos del cliente con el mismo nombre irían al mismo servidor, que procesa estos archivos uno a la vez, resolviendo el problema de duplicación.

Sin embargo, no tengo idea de cómo decir "IF filename =" A-O ".asc muévete aquí ...", así que espero que alguien pueda ayudarme con eso.

Como puede ver, este archivo por lotes se ejecuta en el servidor del repositorio local. En :asc, comenzamos por ver si el primer servidor de procesos, SERVER01, ya tiene archivos .ASC. Si es así, vamos a :SERVER02, que busca lo mismo. Si actualmente no tiene ningún archivo .ASC esperando ser recogido, entonces va a :process, donde verifica si la carpeta del repositorio local, E:\import, tiene alguno. ASC archivos en espera de ser distribuidos. Si es así, moverá ese archivo a SERVER01 para ser procesado. Luego, el script termina copiando algunos archivos de almacenamiento (los archivos .ASC que se han procesado), de regreso al servidor de repositorio. Luego ocurre algo similar en ": process2", pero los mueve a SERVER02 para ser procesados ​​en su lugar. En general, esto proporciona un ligero equilibrio de carga entre los dos.

Entiendo que el script es muy desordenado y ciertamente se puede recortar con más cadenas en lugar de una función diferente para cada ruta de servidor, pero espero que pueda hacerse una idea general.

0
SHADOWSTRIKE1 8 feb. 2021 a las 22:28

1 respuesta

La mejor respuesta

Un intento de hacer esto en Powershell: esto copiará todo en A-O a la vez:

# Get the list of ASC files
$LocalFiles = Get-ChildItem "e:\import\*.asc"

# Check if any files exist
if (!$LocalFiles){Write-Output 'There are no .asc files at this time';break}

# Move the files based on first letter of the file name
$LocalFiles | Where Name -Match '^[A-O].*' | Move-Item -Destination \\SERVER01\import\process\ -Verbose
$LocalFiles | Where Name -Match '^[P-Z].*' | Move-Item -Destination \\SERVER02\import\process\ -Verbose

Si la primera letra no siempre está en mayúscula, use [A-Oa-o] en su lugar.

Si necesita mantener sus marcas de tiempo o atributos, deberá usar robocopy en su lugar así:

$LocalFiles | Where Name -Match '^[A-O].*' | 
  foreach { robocopy src dst $_.name [...] }
0
user19702 8 feb. 2021 a las 22:52