Home > Blockchain >  Delete Folders on Remote PC with Certain names
Delete Folders on Remote PC with Certain names

Time:09-28

This is a sample code that allows me to delete all folders with the name ".RemoveAsap" attached to them

@echo on
set dir="\\TestPC2\c$\Users"
FOR /D /R %dir% %%X IN (*.RemoveAsap) DO RMDIR /S /Q "%%X"
pause
exit

Simply running the code as is runs perfectly but when I try to make the code more interactive, I get the error

@echo on
cd C:\Users\User1\Desktop\Test\
TYPE con >> LowDASD.txt
For /F %%A in (LowDASD.txt) do echo "\\%%A\c$\users\" >> LowDASD2.txt
set "LwDs"="LowDASD2.txt"
FOR /D /R "%LwDs%" %%X IN (*.RemoveAsap) DO RMDIR /S /Q "%%X"
pause

LowDASD2.txt would be the address/ directory location where the directories will be deleted, IE \\TestPC2\c$\Users

The code does not delete anything or give an error that "the path is too long" at least it was doing that with the previous variations that I was trying. If someone can help me with this, i would greatly appreciate it.

CodePudding user response:

FOR /D /R "%LwDs%" %%X IN (*.RemoveAsap) DO RMDIR /S /Q "%%X"

Simply will not work, as %LwDs% is a filename.

FOR /F "usebackq delims=" %%j in ("%LwDs%") do  FOR /D /R "%%j" %%X IN (*.RemoveAsap) DO RMDIR /S /Q "%%X"

You would think might work - %%j being assigned to each entry in the %LwDs% file in turn; usebackq used because the filename is "quoted" (see for /? from the prompt for documentation)

But it doesn't - the for /d /r syntax doesn't accept metavariables...

So - try

FOR /F "usebackq delims=" %%j in ("%LwDs%") do set "target=%%j"&call :expunge

Where expunge is an internal subroutine. The colon is required

:expunge
echo target="%target%"
FOR /d /r "%target%" %%X IN (*.RemoveAsap) DO echo RMDIR /S /Q "%%X"
echo ====================
goto :eof

An internal subroutine should be placed after an unconditional goto, which should in your case follow the pause

pause
goto :eof

Where :eof (compulsory colon again) is defined as the physical end-of-file and should not be used as a user-label. Reaching physical end-of-file returns from a call.

Always verify against a test directory before applying to real data.

Note that the rmdir is merely being echoed for testing purposes - remove the echo keyword after testing to activate.

CodePudding user response:

Try using FORFILES, instead of the command FOR, this way you can make it work like this:

:: forfiles /p "folder_location"  'args' '/c "cmd /c del /f /q @path"'

:: So...

cd C:\Users\User1\Desktop\Test\
TYPE con >> LowDASD.txt
For /F %%A in (LowDASD.txt) do echo "\\%%A\c$\users\" >> LowDASD2.txt

set "LwDs=LowDASD2.txt"

forfiles /p %LwDs% /s /c "cmd /c del /f /q @path"
:: You can use '/d -90' to delete files older than 90 days in the folder

  • Related