Скрипт удаляет файлы в папке, а также пытается удалить другие файлы вне папки - PullRequest
1 голос
/ 21 мая 2019

Я использую пакетный скрипт для удаления некоторых файлов в локальной папке, где находится скрипт.Тем не менее сценарий пытается удалить файлы, расположенные в другом месте (папка Program Files (x86)), что очень страшно (надеюсь, эти файлы защищены от чтения): я получаю следующие сообщения об ошибках:

C: \ Program Files (x86) \ PathToFile \ TimeSeries.DFSGenericBridge.dll Доступ запрещен
C: \ Program Files (x86) \ PathToFile \ ClimateChange.DfsReader.dll Доступ запрещен
...

Я думал, что цикл for зацикливался только внутри папки, в которой находится скрипт.

@echo off
Set exten=*.dfs*
for /f "delims=" %%F in ('Where /F %exten%') do (
       del %%F
    )
)

Я ожидаю, что сценарий только попытался удалить файлы в папке, где расположен файл сценария.

Как можно избежать этого побочного эффекта?

Ответы [ 4 ]

0 голосов
/ 21 мая 2019

Учитывая предоставленные вами код и задачу, , чтобы удалить некоторые файлы в локальной папке, где находится сценарий , я не вижу никаких причин для реализации этого через цикл For.

Если все, что вам нужно, это удалить все файлы, расширение которых начинается с .dfs, из каталога, в котором находится запущенный , вам нужна только однострочная команда :

@Del /Q "%~dp0*.dfs"

Откройте окно командной строки и введите del /?, чтобы прочитать информацию об использовании.

Используя возвращенную информацию, если вы хотите удалить файлы с любым расширением, начинающимся с .dfs, из каталога, содержащего запущенный скрипт, и всех его подкаталогов , тогда вы будете использовать:

@Del /Q /S "%~dp0*.dfs"
0 голосов
/ 21 мая 2019

Вам вообще не требуется where для этого, на самом деле я даже не рекомендую использовать где для этого.

Просто используйте for /R, который будет проходить через подкаталоги из указанного каталога (откуда был запущен скрипт).

@echo off
set "exten=*.dfs*"
for /R %%F in (%exten%) do (
   echo del "%%F"
)

Однако, если вы хотите удалить файлы только из корневого каталога, в котором был запущен скрипт, а не из подкаталогов:

@echo off
set "exten=*.dfs*"
for %%F in (%exten%) do (
   echo del "%%F"
)

Удалите echo, которые были добавлены как отказоустойчивые, как только вы довольны выводом на экран. Добавление echo к вашему исходному сценарию также помогло бы вам не удалять файлы, которые вы никогда не намеревались удалять, поэтому подумайте об этом в следующий раз.

для получения дополнительной информации for команда, откройте cmd.exe и запустите:

  • for /?
0 голосов
/ 21 мая 2019

Команда where также относится к системным переменным среды PATH и PATHEXT при поиске файлов. Чтобы ограничить поиск текущим каталогом, игнорируя при этом PATH, вам необходимо добавить префикс .:, например:

for /F "delims= eol=|" %%F in ('where ".:%exten%"') do (
    ECHO del "%%F"
)

Тем не менее, это все равно относится к PATHEXT, так что это также будет соответствовать чему-то вроде somefile.dfs.exe - не уверен, если вы этого хотите ...


В любом случае, лучше использовать прямой цикл for :

for %%F in ("%exten%") do (
    ECHO del "%%~F"
)

Или вместо этого вы используете команду dir :

for /F "delims= eol=|" %%F in ('dir /B /A:-D "%exten%"') do (
    ECHO del "%%F"
)

Но учтите, что where обрабатывает символы подстановки не совсем так, как for и dir (которые являются cmd -нтернальными командами), поскольку последние также учитывают короткие 8.3 имен файлов .

Есть следующие способы избежать этого:

  1. с использованием findstr для фильтрации выходных данных или dir /B:

    set "FILTER=\.dfs"
    for /F "delims= eol=|" %%F in ('dir /B /A:-D "%exten%" ^| findstr /I /E /C:"%FILTER%"') do (
        ECHO del "%%F"
    )
    

    В зависимости от критериев поиска может потребоваться добавить параметр /R в findstr.

  2. с использованием where и временным удалением PATHEXT:

    set "PE=%PATHEXT%" & set "PATHEXT="
    for /F "delims= eol=|" %%F in ('where ".:%exten%"') do (
        ECHO del "%%F"
    )
    set "PATHEXT=%PE%"
    

    Обратите внимание, что изменение PATHEXT влияет только на этот экземпляр cmd и потенциальные дочерние экземпляры.

После проверки вывода удалите верхний регистр ECHO, чтобы фактически удалить файлы.

0 голосов
/ 21 мая 2019

В вашем случае цикл for будет перечислять все файлы с вывода where, независимо от текущей папки. Просто беги

where /f *.dfs*

в командной строке, и вы увидите проблему: where показывает все файлы на диске. Используйте переключатель /r, если хотите уменьшить область действия:

 /R       Recursively searches and displays the files that match the
          given pattern starting from the specified directory.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...