2017-01-06 276 views
0

我需要移动然后从磁盘上删除文件所在的目录。结构看起来像这样:在批处理脚本文件中命令rmdir无法正常工作

./Export 
    /Report_1 
    /12345 
     /something.pdf 
    /Report_2 
    ... 

我的代码如下所示:

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 

cd Export 
for /D %%I in (%~dp0Export\*) do (
    set "input=%%~nI" 
    for /f "tokens=2 delims=_" %%a in ("!input!") do (
     md %~dp0new_reports\new_report_%%a 
     cd Report_%%a 
     for /R %%f in (*.pdf) do (
      for %%S in (%%f) do (
       if %%~zS NEQ "0" (
        move %%f %~dp0new_reports\new_report_%%a 
        cd .. 
        set "id=%%a" 
        echo !id! 
        rmdir /S /Q "%~dp0Export\Report_!id!\" 
       ) 
      ) 
     ) 
    ) 
) 
@echo Finished .... 

命令rmdir仅删除与ID(/12345)的子文件夹,但REPORT_1文件夹仍然存在,但是空的。我试过echo “%〜dp0Export \ Report_!id!\”,它看起来没问题。

所以对剧本结构的结尾是这样的:

./Export 
     /Report_1 
     /Report_2 
     ... 

我需要删除文件夹REPORT_1等,也是如此。

如果我复制命令到控制台它可以工作,但在批处理脚本中,它不工作,我需要。

+0

这是Windows下的_batch_编程,而不是* nix系统上的_bash_编程。删除标签 – Inian

+0

感谢您的编辑。我的错。 – Bulva

+0

1.用cd/D“%〜dp0Export”替换'cd Export';用'pushd'替换'cd Report _ %% a' Report _ %%〜a“';在'for/R %% f'循环的关闭')'后面添加'popd';删除'cd ..'。 2.改变外循环:'for/D %% I in(“%〜dp0Export \ Report_ *”)do('。3.不需要'for %% S'循环,只需访问'%% 〜zf' 4.将变量'input'设置为'%%〜fI' 5.不定义变量'id',只需访问'%%〜a' 6.使用引号:'move“%%〜 f“”%〜dp0new_reports \ new_report _ %%〜a“'。7.更改'rmdir'命令行:'rmdir/S/Q”%〜dp0Export \ %%〜I“' – aschipfl

回答

0

会这样的事情适合你的目的?

@Echo Off 
SetLocal EnableDelayedExpansion 
PushD "%~dp0Export" 2>Nul||Exit/B 
For /D %%I in (*) Do (Set "input=%%~nxI" 
    MD "new_reports\new_report_!input:*_=!" 
    For /F "Delims=" %%f In ('Dir/B/S/A-D "%%~nxI\*.pdf"') Do If %%~zf Neq 0 (
     Move "%%f" "new_reports\new_report_!input:*_=!" && RD/S/Q "%%~nxI")) 
Echo(Finished .... 
Timeout -1 

我已经在Export目录内创建了新的目录,只是为了保持一切。在两个位置将"new_reports\new_report_!input:*_=!"更改为"%~dp0new_reports\new_report_!input:*_=!"以更改为您的首选结构。

+0

非常感谢。得到它了 – Bulva

相关问题