#batch-file #window #delete-file #hardlink #ln
#пакетный файл #окно #удалить-файл #жесткая ссылка #лн
Вопрос:
Я создаю много жестких ссылок каждую неделю. Когда приходит время их очистить, я обнаруживаю, что использую «DeleteAllHardlinks.bat» для ln (https://schinagl.priv.at/nt/ln/ln.html ) но мне приходится перетаскивать каждый файл один за другим.
Я бы с удовольствием нашел способ просто выбрать 100 файлов и поместить их в файл .bat, подождать некоторое время и найти все эти файлы и жесткие ссылки удаленными навсегда. Можно ли как-нибудь изменить файл .bat, чтобы разрешить это? (или, может быть, любой другой другой метод для выполнения того же самого?)
@echo off
REM
REM Check for commandline args
REM
if "[%~1]" == "[]" goto error
set LN=ln.exe
REM
REM List hardlink sibblings and delete all siblings
REM
for /f "delims=" %%a in ('@%LN% --list "%~1"') do (
del /f "%%a"
)
goto ausmausraus
:error
echo DeleteAllHardlinks: Argument is missing. Usage DeleteAllHardlinks ^<filename^>
echo e.g. DeleteAllHardlinks c:datamyfile.txt
:ausmausraus
echo on
Заранее спасибо!
Комментарии:
1. @keiju
ln.exe
не является стандартным выводом команды Windows при запуске в окне команднойhelp
строки или на странице документации Microsoft, на которую ссылается. Его также нет в списке SS64.com — A-Z индекс команд Windows CMD , который содержит лучшую документацию для всех команд Windows, включая mklink , для создания символической ссылки каталога, жесткой ссылки или соединения каталогов.2. @keiju
dir /AL
можно использовать для получения списка всех символических ссылок каталогов и соединений каталогов в каталоге, как описаноdir /?
. Однако пакетный файл можно очень легко изменить, чтобы поддерживать не только первый аргумент, но и все строки аргументов имени файла, передаваемые в пакетный файл, используя еще одинfor
цикл и%*
, как объясняетсяcall /?
, т. Е.for %%I in (%*) do for /F "delims=" %%J in ('ln.exe --list "%%~I" 2^>nul') do del /F "%%~J"
В качестве замены существующегоfor
цикла. Но приложение, запускающее the bat, должно передавать каждое имя файла, заключенное в двойные кавычки, для правильной работы.
Ответ №1:
Большое спасибо Mofi!
Пакетный файл может быть очень легко изменен для поддержки не только первого аргумента, но и всех строк аргументов имени файла, передаваемых в пакетный файл, с помощью еще одного
for
цикла и%*
, как объясняетсяcall /?
, т. Е. Использовать в качестве замены существующегоfor
цикла:for %%I in (%*) do for /F "delims=" %%J in ('ln.exe --list "%%~I" 2^>nul') do del /F "%%~J"
Но приложение, запускающее пакетный файл, должно передавать каждое имя файла, заключенное в двойные кавычки, для правильной работы.
Просто используя for
, как предложено в комментарии, проблему решили отлично.