Удалить файлы, указав каталог - PullRequest
0 голосов
/ 12 октября 2018

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

@echo off
setlocal
:: Size is in bytes
set "min.size=100000"

for /f  "usebackq delims=;" %%A in (`dir /b /A:-D *.*`) do If %%~zA LSS %min.size% del "%%A"

Это работает, если я помещаю пакетный файл в папку, но он также удаляет пакетный файл.

Однако как мне сохранить командный файл в другом месте и явно указать путь к каталогу?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если вы хотите перейти в PowerShell, следующий скрипт может работать.Если вы уверены, что правильные файлы будут удалены, удалите -WhatIf из командлета Remove-Item.

$deldir = 'C:\Temp'
$minsize = 100000
$precious = 'Remove-UnderSize.ps1', 'Remove-UnderSize.bat'

Get-ChildItem -File -Path $deldir |
    ForEach-Object {
        if (-not ($precious -contains $_.Name)) {
            if ($_.Length -lt $minsize) {
                Remove-Item -Path $_.FullName -WhatIf
            }
        }
    }

Этот сценарий можно вызвать из сценария bat-файла cmd.exe.

powershell -NoProfile -File .\Remove-UnderSize.ps1
0 голосов
/ 12 октября 2018

Самое простое решение - создать каталог, из которого временно удаляются такие файлы, как C:\Temp\Test, активный каталог.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Size is in bytes
set "min.size=100000"
set "FullBatchFileName=%~f0"

pushd "C:\Temp\Test"
rem Do nothing if the command line above fails unexpected.
if errorlevel 1 goto EndBatch

for /F "eol=| delims=" %%I in ('dir * /A-D-H /B /OS 2^>nul') do if not "%FullBatchFileName%" == "%%~fI" if %%~zI LSS %min.size% ( del "%%I" ) else goto DeletionDone

:DeletionDone
popd

:EndBatch
endlocal

Командная строка DIR выполняется FOR в отдельном командном процессе, запущенном с cmd.exe /C в фоновом режиме, и FOR захватывает все строки, выводимые DIR для обработки STDOUT .Сообщение об ошибке, выданное DIR для обработки STDERR при обнаружении не скрытого файла в текущем каталоге, перенаправляется с 2>nul на устройство NUL для его подавления.

Прочтите также статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul.Оператор перенаправления > должен быть экранирован с помощью символа вставки ^ в командной строке FOR , чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.

Опция DIR /OS приводит к выводу списка не скрытых файлов с помощью DIR упорядоченный по размеру с наименьшим первым и наибольшим последним.

FOR будет пропускать строки, начинающиеся с точки с запятой, что означает, что он будет пропускать файлы, имя файла которых начинается с ;, то естьв общем возможно.Этого можно избежать, указав eol=| вертикальную черту в качестве символа конца строки, который не может содержать имя файла.

FOR разделит строки на подстроки с использованием обычного пробела и горизонтальной табуляциив качестве разделителя и назначит только первую подстроку переменной цикла I.Имена файлов могут содержать один или несколько пробелов.Поэтому delims= используется для определения пустого списка разделителей, которые полностью отключают разделение строк и присваиваются переменной цикла I полное имя файла.

Условие IF if not "%FullBatchFileName%" == "%%~fI" сравнивает регистрозависимое полное имя файла пакета (диск + путь + имя + расширение) с полным именем текущего файла.Это условие имеет значение true , если текущий файл не является текущим пакетным файлом.

Следующее условие IF if %%~zI LSS %min.size% сравнивает размер файла текущего преобразованного файла.в 32-разрядное целое число со знаком с указанным размером файла, также преобразованное в 32-разрядное целое число со знаком.Это сравнение размеров файлов не выполняется для файлов с 2 GiB или более, поскольку размер такого большого файла превышает максимальное положительное 32-разрядное целое число со знаком 2147483647.

Цикл FOR завершается с goto DeletionDone в первой строке, размер файла которого равен или превышает указанный минимальный размер, поскольку все последующие файлы, выводимые DIR , определенно имеют размер файла, равный или превышающий указанный минимальный размер, посколькувыходные данные упорядочены по размеру от наименьшего к наибольшему.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • call /? ... поясняет %~f0 ... полное имя файла аргумента 0 - текущий исполняемый пакетный файл.
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?
  • rem /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...