首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据名称创建文件夹的批处理脚本,添加到现有代码中

根据名称创建文件夹的批处理脚本,添加到现有代码中
EN

Stack Overflow用户
提问于 2012-01-21 10:03:08
回答 2查看 1.4K关注 0票数 1

下面的代码工作得很好,下面列出了它的功能:

  1. 它将基于前4个字符的文件移动到一个预先创建的文件夹中,该文件夹具有相同的前4个字符
  2. ,如果该文件夹不存在,它将不会移动该文件,因为没有具有相同的前4个字符的文件夹。

@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份文件

  • X32A-test.docx或X32A-test.pptx (只有一个docx或pptx ),“永远不会有同一个name")
  • X32A-test.pdf
  • X32A-test.avi
  • X32A-test-eng.sub
  • X32A-test-small.jpg

的两个

如果文件夹不存在,我希望代码能够根据文件名创建一个文件夹,如果它的扩展名是docx或pptx。

因此,使用上面的示例,它将创建一个名为"X32A-test“的文件夹。然后,名称前面有"X32A“的所有其他文件将被移动到新创建的文件夹"X32A-test”。

我希望这是足够清楚的。如果没有,请问我更多的信息。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-01-21 14:28:25

在您的情况下,使用simple FOR而不是FOR /F要简单得多,效率也更高。

与其循环遍历每个文件并单独移动它们,不如使用通配符更容易、更有效。

第一个循环查找.pptx和.docx文件并根据需要创建文件夹。

第二个循环查找所有目录,并将以目录名开头的所有文件移动到目录中。

代码语言:javascript
复制
@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的目录名的影响。

代码语言:javascript
复制
@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

注意,如果文件名包含!,则此解决方案可能会失败。如果出现这种情况,则需要在循环中切换延迟扩展。

票数 2
EN

Stack Overflow用户

发布于 2012-01-21 10:17:45

您可以在!var:~offset,len!计算中使用负偏移量,如下所示:

代码语言:javascript
复制
set fspec=X32A-test.docx
echo !fspec:~-10!
echo !fspec:~0,-10!

上面的第二行给出了-test.docx,您只需用一个if语句(或两个)对照您想要的两种可能性来检查它。

然后,可以使用第三行获取创建目录的其余名称。

下面的示例脚本演示了如何做到这一点:

代码语言:javascript
复制
@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。您还需要将setif语句集成到您的循环中,但是,根据到目前为止的情况,您应该不会遇到什么问题。

如果正如您在注释中所指出的,前四个字符是键,最后五个字符决定是否创建目录,如下所示:

代码语言:javascript
复制
x32s-test.docx
a21w-production.pptx
xxxx-whatever_the_blazes_you_want.some_other_rubbish.docx

那么你只对前四名和最后五名感兴趣:

代码语言:javascript
复制
@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

这将检查正确的扩展和输出:

代码语言:javascript
复制
mkdir a12b

如预期的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8952141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档