从任何地方删除未知文件夹下的特定子文件夹

时间:2016-03-20 05:42:46

标签: windows powershell batch-file windows-10 delete-file

我有一个名为G:\Project\Projects

的文件夹

此文件夹包含一些(约20个)未知子文件夹。某些子文件夹有一个名为SSS的文件夹和一个名为deleteme.doc

的文件

我想使用批处理文件或powershell文件删除所有这些SSS文件夹(包含内容)和deleteme.doc文件。我不想删除这些文件或文件夹深深嵌套到子文件夹中,只是那些直接位于子文件夹下的文件夹。

例如,我想删除此文件夹

G:\Project\Projects\proj 1\sss

但不是这3 -

G:\Project\Projects\proj 1\other\sss

G:\Project\Projects\sss

G:\Project\Projects\proj 1\sss (it is a file)

问题是我想简单地从任何地方双击 - 运行批处理/ powershell文件,可能来自另一个分区或驱动器(甚至是网络计算机)。

我试过RMDIR G:\Project\Projects\*\SSS它似乎没有用。

请尽可能解释您的答案,同时显示回收站删除和parma删除的命令。虽然我认为如果没有PowerShell,就无法发送回收垃圾箱。

不需要管理员权限来删除非系统分区中的文件夹吗?

Windows 10. powershell版本5

3 个答案:

答案 0 :(得分:3)

@ECHO Off
SETLOCAL
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="

:: set defaults
SET "$dirname=sss"
SET "$filename=deleteme.doc"
SET "$from=c:\wherever\you\like"

:: analyse command line
:: syntax file="filename" " dir=dirname" from="dirname" (/switches)
:: each is optional. default is as established above
:: /d  - delete directory only if it is completely empty
:: /dn - delete directory only if it is not completely empty
:: /ds - delete directory only if it is completely empty or if no files in its subdirectory tree
:: /fe - delete file if empty
:: /fn - delete file if not empty
:: /b  - both file and directory must exist to make deletions
::
FOR %%a IN (%*) DO IF DEFINED $twopart (CALL :parttwo %%a) ELSE (
 SET "$processed="
 IF /i "%%a"=="dir"     SET "$processed=Y"&SET "$twopart=$dirname"
 IF /i "%%a"=="file"    SET "$processed=Y"&SET "$twopart=$filename"
 IF /i "%%a"=="from"    SET "$processed=Y"&SET "$twopart=$from"
 IF /i "%%a"=="/b"      CALL :setswitch b
 IF /i "%%a"=="/d"      CALL :setswitch d
 IF /i "%%a"=="/dn"     CALL :setswitch dn
 IF /i "%%a"=="/ds"     CALL :setswitch ds
 IF /i "%%a"=="/fe"     CALL :setswitch fe
 IF /i "%%a"=="/fn"     CALL :setswitch fn
 IF NOT DEFINED $processed CALL :extras %%a
)

IF DEFINED $extras ECHO(%$extras% NOT understood)&pause&GOTO :EOF 

:: resolve switch compatibility

IF DEFINED $d  IF DEFINED $dn SET "$incompatible=/d /dn"
IF DEFINED $fe IF DEFINED $fn SET "$incompatible=%$incompatible% /f /fn"

IF DEFINED $incompatible ECHO(%$incompatible% incompatible)&pause&GOTO :EOF 

:: if $from is set, make it quoted.
IF DEFINED $from SET "$from="%$from:"=%""

:: Now search for the directory
FOR /d /r %$from% %%a IN ("%$dirname%") DO IF EXIST "%%a\." (
 SET "$victim=%%a"
 CALL :deldir
)
IF NOT DEFINED $b FOR /r %$from% %%a IN ("%$filename%") DO IF EXIST "%%a" (
 SET "$victim=%%~dpa%$filename%"
 CALL :delfile
)

GOTO :eof

:: delete the victim directory if all other conditions are met
:: take care of file as well if required.
:deldir
SET "$victim=%$victim:"=%"
IF DEFINED $b IF NOT EXIST "%$victim%\..\%$filename%" GOTO :eof
:: if the directory has any contents and "/d" was specified, skip deletion
IF DEFINED $d (
 FOR /f %%z IN ('dir /b "%$victim%" 2^>nul') DO GOTO :eof
)
:: if the directory has files in its subtree and "/ds" was specified, skip deletion
IF DEFINED $ds (
 FOR /f %%z IN ('dir /s /b /a-d "%$victim%"  2^>nul') DO GOTO :eof
)
:: if the directory has no files and none in its subtree and "/dn" was specified, don't skip deletion
IF DEFINED $dn (
 FOR /f %%z IN ('dir /b "%$victim%"  2^>nul') DO GOTO deldir1
 GOTO :eof
)
:: delete the directory
:deldir1

ECHO(DEL /s /f /q "%$victim%"
SET "$victim=%$victim%\..\%$filename%"
IF EXIST "%$victim%" GOTO delfile 
GOTO :eof

:delfile
FOR %%z IN ("%$victim%") DO (
 IF DEFINED $fn IF "%%~zz"=="0" GOTO :EOF 
 IF DEFINED $fe IF "%%~zz" neq "0" GOTO :EOF 
)
ECHO(DEL /f /q "%$victim%"
GOTO :eof



:parttwo
SET "%$twopart%=%~1"
SET "$twopart="
GOTO :eof

:extras
SET "$extras=%$extras% %~1"
GOTO :eof

:setswitch
SET "$processed=Y"
SET "$%1=Y"
SHIFT
IF "%1" neq "" GOTO setswitch
GOTO :EOF

这是一个在释放之前需要测试的一般解决方案。

所需的RD命令仅用于ECHO以用于测试目的。 在您确认命令正确后,将ECHO(RD更改为RD以实际删除目录。

为了测试目的,所需的DEL命令仅为ECHO在您确认命令正确后,将ECHO(DEL更改为DEL以实际删除文件。

第一部分分析了提供给程序的参数和开关。

显示默认值,需要根据您的具体情况进行调整。

该命令可以作为

运行
*thisname* from=c:\new\location dir=xxx file=hello.txt /d

其中from指定树木行走的开始位置,找到要定位的文件名,以及dir要删除的目录名。

还列出了开关。

程序只检查感兴趣元素的命令行,并根据需要设置值。

然后我们遍历树,查找目录名,然后根据开关设置做出决定。

然后再次遍历树,寻找文件名。

答案 1 :(得分:1)

这样的东西
for /f %A in ('dir "c:\somewhere\deleteme.doc"') Do echo rd "%~dpA"
  

不需要管理员权限来删除非系统分区中的文件夹吗?

我们如何知道您拥有的权限。输入icacls c:\somewhere即可查看。

你需要知道你的问题。

答案 2 :(得分:0)

我使用this -

创建了一个简短的PowerShell解决方案
$targetName='ss s';
foreach ($file in Get-Childitem "G:\Project\Projects\" )
{
   $fname=$file.name;
   if (Test-Path "G:\Project\Projects\$fname\$targetName\")
        { 
            $shell = new-object -comobject "Shell.Application"
            $item = $shell.Namespace(0).ParseName("G:\Project\Projects\$fname\$targetName")
            $item.InvokeVerb("delete")

        }
}

此PowerShell脚本在确认弹出后将文件夹发送到回收站。 (这不会发送任何名为'ss'的文件)

这似乎适用于批处理文件脚本 -

set "b=ss s"
for /d %%a in (*) do  IF EXIST "%%a\%b%\*" (rmdir /s "%%a\%b%")

如果目标文件夹名为“$ ss s”,则必须将变量设置为"b=/$ss s"