批量移动依赖于字母文件名的文件?
Batch to move files dependent on alphabetical file name?
我正在尝试重写我们使用的这个脚本(已编辑服务器名称),以解决工作中的问题。
: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
最初这个脚本是为了平衡两个处理应用程序之间的所有文件,这取决于一个是否已经有一个正在处理的文件,它将把它交给另一个...检查文件名并仅将某些字母范围导出到每个处理服务器。所以我假设这意味着我们不是一次移动一个,而是拆分当前位于存储库文件夹中的所有 .ASC
文件,并将一半移动到一台服务器,另一半移动到另一台服务器(然后将由应用程序一次提取一个)。
我们有 .ASC
个包含客户数据的文件(使用旧的专有应用程序写入 SQL)。他们被命名为 CLIENTNAME.asc
,我们有大约 200
个客户。这个软件的用途,或者它的功能是不能改变的,所以为了加快文件处理速度,我们创建了两个服务器,运行那个应用程序。然后我将一个小的 CMD 脚本放在一起,该脚本查看这些文件的中央存储库,并将它们作为一种负载平衡器在每个服务器之间分发。我们发现的问题是,如果同时处理同一客户端的两个文件(一个到一台服务器处理,另一个到另一台服务器),它会导致如何导入到 SQL.
所以我想到的解决方案是让脚本将所有以 A
到 O
开头的 .ASC
文件移动到一台服务器,而那些以 L
通过 Z
转到另一个。然后我会弄乱这些字母范围以确保正确平衡。这意味着所有具有相同名称的客户端文件都将转到同一台服务器,该服务器一次处理一个文件,从而解决了重复问题。
但是,我不知道怎么说“IF filename = “A-O”.asc move here...”,所以我希望有人能帮我解决这个问题。
如您所见,此批处理文件 运行 位于本地存储库服务器上。在 :asc
中,我们首先查看第一个进程服务器 SERVER01
上是否已经有任何 .ASC
文件。如果是这样,我们转到 :SERVER02
,它会检查同样的事情。如果它当前没有任何 .ASC
文件等待被拾取,那么它将转到 :process
,在那里它检查本地存储库文件夹 E:\import
是否有任何 .ASC
等待分发的文件。如果是这样,它将将该文件移动到 SERVER01
进行处理。然后脚本通过将一些存档文件(已处理的 .ASC
文件)复制回存储库服务器来结束。然后在“:process2”中发生了类似的事情,但是将它们移动到 SERVER02
以进行处理。总的来说,这在两者之间提供了轻微的负载平衡。
我知道脚本非常混乱,当然可以用更多的字符串而不是每个服务器路径的不同函数来精简,但希望您能了解总体思路。
尝试在 Powershell 中执行此操作 - 这将立即复制 A-O 中的所有内容:
# 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
如果第一个字母不总是大写,请改用[A-Oa-o]
。
如果您需要保留您的时间戳或属性,您将需要使用 robocopy 而不是像这样:
$LocalFiles | Where Name -Match '^[A-O].*' |
foreach { robocopy src dst $_.name [...] }
我正在尝试重写我们使用的这个脚本(已编辑服务器名称),以解决工作中的问题。
: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
最初这个脚本是为了平衡两个处理应用程序之间的所有文件,这取决于一个是否已经有一个正在处理的文件,它将把它交给另一个...检查文件名并仅将某些字母范围导出到每个处理服务器。所以我假设这意味着我们不是一次移动一个,而是拆分当前位于存储库文件夹中的所有 .ASC
文件,并将一半移动到一台服务器,另一半移动到另一台服务器(然后将由应用程序一次提取一个)。
我们有 .ASC
个包含客户数据的文件(使用旧的专有应用程序写入 SQL)。他们被命名为 CLIENTNAME.asc
,我们有大约 200
个客户。这个软件的用途,或者它的功能是不能改变的,所以为了加快文件处理速度,我们创建了两个服务器,运行那个应用程序。然后我将一个小的 CMD 脚本放在一起,该脚本查看这些文件的中央存储库,并将它们作为一种负载平衡器在每个服务器之间分发。我们发现的问题是,如果同时处理同一客户端的两个文件(一个到一台服务器处理,另一个到另一台服务器),它会导致如何导入到 SQL.
所以我想到的解决方案是让脚本将所有以 A
到 O
开头的 .ASC
文件移动到一台服务器,而那些以 L
通过 Z
转到另一个。然后我会弄乱这些字母范围以确保正确平衡。这意味着所有具有相同名称的客户端文件都将转到同一台服务器,该服务器一次处理一个文件,从而解决了重复问题。
但是,我不知道怎么说“IF filename = “A-O”.asc move here...”,所以我希望有人能帮我解决这个问题。
如您所见,此批处理文件 运行 位于本地存储库服务器上。在 :asc
中,我们首先查看第一个进程服务器 SERVER01
上是否已经有任何 .ASC
文件。如果是这样,我们转到 :SERVER02
,它会检查同样的事情。如果它当前没有任何 .ASC
文件等待被拾取,那么它将转到 :process
,在那里它检查本地存储库文件夹 E:\import
是否有任何 .ASC
等待分发的文件。如果是这样,它将将该文件移动到 SERVER01
进行处理。然后脚本通过将一些存档文件(已处理的 .ASC
文件)复制回存储库服务器来结束。然后在“:process2”中发生了类似的事情,但是将它们移动到 SERVER02
以进行处理。总的来说,这在两者之间提供了轻微的负载平衡。
我知道脚本非常混乱,当然可以用更多的字符串而不是每个服务器路径的不同函数来精简,但希望您能了解总体思路。
尝试在 Powershell 中执行此操作 - 这将立即复制 A-O 中的所有内容:
# 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
如果第一个字母不总是大写,请改用[A-Oa-o]
。
如果您需要保留您的时间戳或属性,您将需要使用 robocopy 而不是像这样:
$LocalFiles | Where Name -Match '^[A-O].*' |
foreach { robocopy src dst $_.name [...] }