我有一个名为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
答案 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"