Как удалить все жесткие ссылки нескольких файлов в Windows 10?

#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 , как предложено в комментарии, проблему решили отлично.