批处理文件以创建文件夹并根据文件名移动文件

时间:2019-06-19 04:45:42

标签: windows batch-file

我是批处理脚本的新手,所以感谢您的帮助。我在这里看到过类似的问题,但无法使我的move功能正常工作。

我的文件格式如下:

19013_01-PG-18-1000_NC_IL2RG_Ex2_F_D01.ab1
19013_01-PG-18-1000_NC_IL2RG_Ex2_R_H01.ab1

我要使用以下格式制作文件夹:

01-PG-18-1000_NC_IL2RG_Ex2

然后将所有具有*01-PG-18-1000_NC*的文件移到该文件夹​​名称中。

这是我到目前为止所拥有的。它以我想要的方式制作文件夹,但是我根本无法移动文件。尝试了move函数的多次迭代,但是我并不完全了解令牌以及令牌与移动文件的关系。

@ECHO OFF
SETLOCAL
SET "sourcedir="whatever my directory name is"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3,4,5 delims=_" %%a IN (
    'dir /b /a-d "*_*-*-*-*_*_*_*.*"'
) DO (  
    MD %%b_%%c_%%d_%%e 2>nul
    MOVE "%%b_%%c_%%d_%%e" "%%b_%%c_%%d_%%e"
)
POPD
GOTO :EOF

1 个答案:

答案 0 :(得分:1)

真正的快捷方式-未经测试

@ECHO OFF
SETLOCAL
SET "sourcedir="whatever my directory name is"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3,4,5,* delims=_" %%a IN (
    'dir /b /a-d "*_*-*-*-*_*_*_*.*"'
) DO (  
 echo ++%%a++%%b++%%c++%%d++%%e++%%f++
    MD %%b_%%c_%%d_%%e 2>nul
    MOVE "%%a_%%b_%%c_%%d_%%e_%%f" "%%b_%%c_%%d_%%e"
)
POPD
GOTO :EOF

您非常接近-echo行应显示如何将文件名解析为%%a .. %%f。由++分隔的部分只是一个非常明显的分隔符,它显示任何元素中是否有空格。

在令牌列表中添加*意味着“在提到的最高令牌编号之后的所有内容”。然后从各部分中重新构造文件名-从%%a开始一起组成字符串,重新插入所有下划线。

这也应该起作用:

@ECHO OFF
SETLOCAL
SET "sourcedir="whatever my directory name is"
PUSHD %sourcedir%
FOR /f %%q IN (
    'dir /b /a-d "*_*-*-*-*_*_*_*.*"'
) do (
 FOR /f "tokens=1,2,3,4,5,* delims=_" %%a IN ("%%q") do
    echo ++%%a++%%b++%%c++%%d++%%e++%%f++FROM++%%q++
    MD %%b_%%c_%%d_%%e 2>nul
    MOVE "%%q" "%%b_%%c_%%d_%%e"
 )
)
POPD
GOTO :EOF

在此版本中,%%q依次获取每个文件名,然后"%%q"可以解析for /f,原始文件名在%%q中保持不变,可以在以下文件中使用: move声明。

[实际上很小]修订:

REM <!-- language: lang-dos -->
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
PUSHD "%sourcedir%"
FOR /f "tokens=1,2,3,4,5,* delims=_" %%a IN (
    'dir /b /a-d "*_*-*-*-*_*_*_*.*"'
) DO IF EXIST "%%a_%%b_%%c_%%d_%%e_%%f" (  
    MD %%b_%%c_%%d_%%e 2>nul
    MOVE "*%%b_%%c*" "%%b_%%c_%%d_%%e"
)
POPD

SET "sourcedir=U:\sourcedir\t h r e e"
PUSHD "%sourcedir%"
FOR /f %%q IN (
    'dir /b /a-d "*_*-*-*-*_*_*_*.*"'
) do IF EXIST "%%q" (
 FOR /f "tokens=1,2,3,4,5 delims=_" %%a IN ("%%q") DO (
    MD %%b_%%c_%%d_%%e 2>nul
    MOVE "*%%b_%%c*" "%%b_%%c_%%d_%%e"
 )
)
POPD

GOTO :EOF

是-误读了您想要移动所有包含的文件-整夜都在玩游戏...

以上批次分为两部分,第一部分使用%%a .. %%f,第二部分使用%%q

面临的困难是move *[pattern]*将移动所有文件,但根据需要for /f...'dir...会建立一个目录中所有匹配文件的列表。

处理完第一个文件名后,其他包含01-PG-18-1000_NC的文件将被移动,因此列表中的下一个01-PG-18-1000_NC文件将出现“找不到文件”错误for已建立。

当然,可以合并一些机制以确保模式01-PG-18-1000_NC仅被处理一次,但是可以为if exists返回并重建的完整文件名使用简单的for...%%a...用于处理MD/MOVE命令的命令,因为在处理下一个01-PG-18-1000_NC时该文件将不再存在(因为它已经被移动)。不过,使用%%q方法要容易得多。

当然,您也可以简单地处理错误消息而不是安装门-但这可能被认为是粗略的。

aschipfl建议在文件名中使用{kbd> Space 之类的分隔符,并且在delims=中添加for...%%q...(是完全有效的(并且不计任何费用)

哦-我在最初的回复中错过了do部分的 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stockaddpage); btnsbmt =(Button)findViewById(R.id.button); btnupdt =(Button)findViewById(R.id.updt_btn); stock_rev = FirebaseDatabase.getInstance().getReference().child("STOCK").child("FLOWERS").child("ROSE").child("instock"); stock_rev.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { finstockval2=dataSnapshot.getValue(long.class); Toast.makeText(stockaddpageActivity.this, ""+finstockval2, Toast.LENGTH_SHORT).show(); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); btnsbmt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Toast.makeText(MainActivity.this, "entered.....", Toast.LENGTH_SHORT).show(); spnitm = (Spinner) findViewById(R.id.typspn); spnname = (Spinner) findViewById(R.id.nmspn); qtyvalues = (EditText) findViewById(R.id.qtyinpt); msrspn = (Spinner) findViewById(R.id.measurespn); itmtype = spnitm.getSelectedItem().toString(); itmname = spnname.getSelectedItem().toString(); stckinpval = qtyvalues.getText().toString(); convrtdval = Long.parseLong(stckinpval); msrval = msrspn.getSelectedItem().toString(); Log.d("first","in click"); if (itmtype.equals("Flowers")) { Toast.makeText(stockaddpageActivity.this, "entered.....flowers", Toast.LENGTH_SHORT).show(); if (itmname.equals("Rose")) { Toast.makeText(stockaddpageActivity.this, "entered.....rose", Toast.LENGTH_SHORT).show(); datareff1 = FirebaseDatabase.getInstance().getReference().child("STOCK").child("FLOWERS").child("ROSE").child("instock"); datareff2 = FirebaseDatabase.getInstance().getReference().child("STOCK").child("FLOWERS").child("ROSE").child("History"); if (convrtdval != null) { if (msrval.equals("Grams")) { calculatedvalue = convrtdval; fintype = "Flowers"; finname = "Rose"; finstockval = finstockval2+calculatedvalue; finstockval2=0; finmeasure = "Grams"; datareff1.setValue(finstockval); Log.d("in gram","in gram"); currentDate =Calendar.getInstance().getTime(); tim = currentDate.toString(); Toast.makeText(stockaddpageActivity.this, "Grams : Added", Toast.LENGTH_SHORT).show(); //Toast.makeText(MainActivity.this, dt, Toast.LENGTH_SHORT).show(); Toast.makeText(stockaddpageActivity.this, tim, Toast.LENGTH_SHORT).show(); } else { calculatedvalue = (convrtdval) * 1000; fintype = "Flowers"; finname = "Rose"; finstockval = finstockval2+calculatedvalue; finstockval=0; finmeasure = "Kilograms"; datareff1.setValue(calculatedvalue); Toast.makeText(stockaddpageActivity.this, "KG : Added", Toast.LENGTH_SHORT).show(); } } } if (itmname.equals("Lily")) { Toast.makeText(stockaddpageActivity.this, "entered.....lilly", Toast.LENGTH_SHORT).show(); datareff1 = FirebaseDatabase.getInstance().getReference().child("STOCK").child("FLOWERS").child("LILLY").child("instock"); datareff2 = FirebaseDatabase.getInstance().getReference().child("STOCK").child("FLOWERS").child("LILLY").child("History"); stock_rev = FirebaseDatabase.getInstance().getReference().child("STOCK").child("FLOWERS").child("LILLY").child("instock"); stock_rev.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { finstockval3 = dataSnapshot.getValue(Long.class); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); if (convrtdval != null) { if (msrval.equals("Grams")) { calculatedvalue = convrtdval; fintype = "Flowers"; finname = "Lilly"; finstockval = finstockval3+calculatedvalue; finmeasure = "Grams"; datareff1.setValue(finstockval); Log.d("in gram","in gram"); currentDate =Calendar.getInstance().getTime(); tim = currentDate.toString(); Toast.makeText(stockaddpageActivity.this, "Grams : Added", Toast.LENGTH_SHORT).show(); //Toast.makeText(MainActivity.this, dt, Toast.LENGTH_SHORT).show(); Toast.makeText(stockaddpageActivity.this, tim, Toast.LENGTH_SHORT).show(); } else { calculatedvalue = (convrtdval) * 1000; fintype = "Flowers"; finname = "Lilly"; finstockval = finstockval3+calculatedvalue; finmeasure = "Kilograms"; datareff1.setValue(calculatedvalue); Toast.makeText(stockaddpageActivity.this, "KG : Added", Toast.LENGTH_SHORT).show(); } } } } } }); } } -总是在您不实际测试代码时发生,尤其是在您感到疲倦时。