下面的代码工作得很好,下面列出了它的功能:
@echo on setlocal enabledelayedexpansion cls pushd R:\Contracts /f "tokens=*“%1 in ('dir /a /b *') do (设置filename=%%1&set dirname=!文件名:~0,4!对于/f "tokens=*“%A in ('dir /ad /b') do ( set dirid=%%A & set dirid=!dir:~0,4!如果“!疯狂!”equ“!脏名字!”(移动%%1 %A)()
我想在这段代码中多加一个函数。请看下面的例子。
我有5份文件
的两个
如果文件夹不存在,我希望代码能够根据文件名创建一个文件夹,如果它的扩展名是docx或pptx。
因此,使用上面的示例,它将创建一个名为"X32A-test“的文件夹。然后,名称前面有"X32A“的所有其他文件将被移动到新创建的文件夹"X32A-test”。
我希望这是足够清楚的。如果没有,请问我更多的信息。
谢谢
发布于 2012-01-21 14:28:25
在您的情况下,使用simple FOR而不是FOR /F要简单得多,效率也更高。
与其循环遍历每个文件并单独移动它们,不如使用通配符更容易、更有效。
第一个循环查找.pptx和.docx文件并根据需要创建文件夹。
第二个循环查找所有目录,并将以目录名开头的所有文件移动到目录中。
@echo on
setlocal enableDelayedExpansion
cls
pushd R:\Contracts\Sites
for %%F in (*.docx *.pptx) do (
set "folder=%%F"
2>nul md !folder:~0,4!
)
for /d %%F in (*) do move %%F* %%F
popd
如果需要,您可以保护自己不受长度小于4的目录名的影响。
@echo on
setlocal enableDelayedExpansion
cls
pushd R:\Contracts\Sites
for %%F in (*.docx *.pptx) do (
set "folder=%%F"
set folder=!folder:~0,4!
if !folder:~0,3! neq !folder! 2>nul md !folder!
)
for /d %%F in (????) do (
set "folder=%%F"
if "!folder:~0,3!" neq "%%F" move %%F* %%F
)
popd
注意,如果文件名包含!
,则此解决方案可能会失败。如果出现这种情况,则需要在循环中切换延迟扩展。
发布于 2012-01-21 10:17:45
您可以在!var:~offset,len!
计算中使用负偏移量,如下所示:
set fspec=X32A-test.docx
echo !fspec:~-10!
echo !fspec:~0,-10!
上面的第二行给出了-test.docx
,您只需用一个if
语句(或两个)对照您想要的两种可能性来检查它。
然后,可以使用第三行获取创建目录的其余名称。
下面的示例脚本演示了如何做到这一点:
@setlocal enableextensions enabledelayedexpansion
@echo off
set fspec=X32A-test.docx
set bit1=!fspec:~-10!
set bit2=!fspec:~0,-10!
if .!bit1!.==.-test.docx. echo mkdir !bit2!
if .!bit1!.==.-test.pptx. echo mkdir !bit2!
endlocal
我正在回显mkdir
命令,而不是执行它,因此您需要取出echo
。您还需要将set
和if
语句集成到您的循环中,但是,根据到目前为止的情况,您应该不会遇到什么问题。
如果正如您在注释中所指出的,前四个字符是键,最后五个字符决定是否创建目录,如下所示:
x32s-test.docx
a21w-production.pptx
xxxx-whatever_the_blazes_you_want.some_other_rubbish.docx
那么你只对前四名和最后五名感兴趣:
@setlocal enableextensions enabledelayedexpansion
@echo off
set fspec=a12b-whatever_the_blazes_you_want.some_other_rubbish.docx
set bit1=!fspec:~-5!
set bit2=!fspec:~0,4!
if .!bit1!.==..docx. echo mkdir !bit2!
if .!bit1!.==..pptx. echo mkdir !bit2!
endlocal
这将检查正确的扩展和输出:
mkdir a12b
如预期的那样。
https://stackoverflow.com/questions/8952141
复制相似问题