Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file CMD:对文件夹结构中的文件进行排序_Batch File_Cmd - Fatal编程技术网

Batch file CMD:对文件夹结构中的文件进行排序

Batch file CMD:对文件夹结构中的文件进行排序,batch-file,cmd,Batch File,Cmd,我试图创建一个BAT,自动将输入文件夹中的拉链排序到相应的目标文件夹中 所有拉链都以序列号001 File.zip、002 File.zip、003 File.zip等开头 目标文件夹根据相同的方案命名:001、002、003、…、999 因此,如果一个ZIP文件进入到输入文件夹中,它应该自动分配到相应的目标文件夹,并具有相同的编号 但由于目标文件夹最多999个,我不想事先写入所有路径 到目前为止,我的代码如下所示: SET input=C:\Daten\Input SET target=C:\

我试图创建一个BAT,自动将输入文件夹中的拉链排序到相应的目标文件夹中

所有拉链都以序列号001 File.zip、002 File.zip、003 File.zip等开头

目标文件夹根据相同的方案命名:001、002、003、…、999

因此,如果一个ZIP文件进入到输入文件夹中,它应该自动分配到相应的目标文件夹,并具有相同的编号

但由于目标文件夹最多999个,我不想事先写入所有路径

到目前为止,我的代码如下所示:

SET input=C:\Daten\Input
SET target=C:\Daten\Target

for /r %input% %%a in (*.zip) do (
Set FILE=%%~nxa
Set FILEWITHOUTEXT=%%~na

Set SPLITABLE_NAME=!FILEWITHOUTEXT:_= !
for %%t in (!SPLITABLE_NAME!) do set FIRSTTOKEN=%%t
)
copy /Y %%a %target%\!FIRSTTOKEN!\!FILE! 

不幸的是,整个过程根本不起作用。

根据Stephan的评论和一些额外的代码清理和最佳实践用法,您的代码应该是这样的

:sort
SET "input=C:\Daten\Input"
SET "target=C:\Daten\Target"

for /r "%input%" %%a in (*.zip) do (
    For /f "tokens=1 delims=_ " %%t in ("%%~na") do (
        copy /Y "%%~a" "%target%\%%t\"
    )
)

我看你已经选择并回答了。如果你想推进一种现代脚本语言,你可以考虑使用PultS壳。如果您在受支持的Windows平台上,PowerShell将可用

一旦确信文件将被正确复制,请从
复制项
命令中删除
-WhatIf

powershell -NoLogo -NoProfile -Command ^
    "Get-ChildItem -File -Path 'C:\Daten\Input' -Filter '???_*.zip' |" ^
        'ForEach-Object {" ^
            "if ($_.Name -match '^(\d{3})_.*') {" ^
                "Copy-Item $_.FullName "C:\Daten\Target\$($Matches[1])" -Whatif" ^
            "}" ^
        "}"

对于(!SPLITABLE_NAME!)中的%%t,do set FIRSTTOKEN=%%t
将每个令牌放入(相同)变量,留下最后一个令牌。使用(“%~na”)中的/f“tokens=1 delims=\%%t设置“FIRSTTOKEN=%%t”。我尝试过这样做,但它不会对相应文件中的拉链进行排序。你有其他想法吗?@Proki,代码缺少一个%符号
(“%%~na”)
不管您的输入文件名示例在文件名中从未显示下划线。继续执行时,请确保始终提供一个。您还将在
FOR
命令之外进行复制,这意味着它将只复制最后一个迭代的文件。您也不需要为环境变量指定任何FOR变量。这意味着您根本不需要使用延迟扩展。只需使用变量。实际上它不会复制任何文件,因为您正在使用%%a作为源文件。非常感谢!我可以再问一个问题吗?如果输入不是ZIP,而是具有相同命名方案(001-999)的文件夹,我将如何更改代码,以便将文件夹中的数据复制到目标文件夹(而不是文件夹本身)?