我是批处理脚本的新手,所以感谢您的帮助。我在这里看到过类似的问题,但无法使我的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
答案 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();
}
}
}
}
}
});
}
}
-总是在您不实际测试代码时发生,尤其是在您感到疲倦时。