Пакетная команда> Dir выводится, когда отказано в доступе к папке / файлу, она хочет просто пропустить ее или альтернативу - PullRequest
1 голос
/ 19 января 2020

TLDR: хочу остановить DIR от прикосновения к папкам, к которым у него нет доступа, потому что он вылетает при попытке, или есть другой способ сделать точно такой же аудит, как DIR / s / b и DIR / s, но с лучшим обработка ошибок / способность просто пропустить вместо сбоя.

В теории ничего сложного.

DIR /s /b "folder\">"outputfile.txt"

Проблема, это в сети. Теоретически ничего сложного

DIR /s /b "\\servername\sharefolder\">"outputfile.txt"

Проблема: я пытаюсь проверять общие ресурсы, с которых работают docker контейнеры. И DIR просто высовывается всякий раз, когда сталкивается с чем-то, к чему у него нет прав доступа.

Я пытаюсь сделать аудит, большой список файлов. Я могу позволить себе полностью игнорировать некоторые папки, но я не собираюсь просто заставить их исчезнуть из выходного файла. Мне нужно, чтобы DIR не go поверх них, иначе он расправляется с носителями.

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

Реальная проблема заключается в том, что каждый раз, когда DIR отключается, сценарий продолжается, фактически просто пропускает ПОЛНОЕ ОСТАВЛЕНИЕ всей общей емкости диска, создавая таким образом тупо бесполезные файлы аудита.

Я в основном 4 часа в этом, и я схожу с ума по этому более чем основному c command.

Идеальным решением было бы то, что я могу легко объявить папки, которые пропускаются при их обнаружении, независимо от их глубины в дереве папок, и, возможно, также иметь возможность пропускать пути к папкам, например * 1019. *, иначе он пропускает ngix, только если в appname\foo\.

я бы как можно больше хотел бы избежать сотрудничества с .vbs mpanion ", но я мог бы в конечном итоге принять один, если он на самом деле делает свое дело, и выплевывает тот же формат данных, что и DIR /s и DIR /s /b (потому что да, я хочу и мета, и raw).

Спасибо, что читаете меня, и я надеюсь, что кто-то поможет этой неудаче!

Ответы [ 2 ]

1 голос
/ 19 января 2020

Самый простой способ достичь этого - удвоить команду Dir. Перенаправьте весь вывод из первого экземпляра в nul и используйте && в качестве условного теста для включения второго экземпляра для регистрации информации.

REM Check access in the first instance
DIR /s /b "\\servername\sharefolder\">"testaccess.txt" 2>nul >nul && DIR /s /b "\\servername\sharefolder\">"outputfile.txt"
0 голосов
/ 19 января 2020

Используйте это:

DIR /s /b "\\servername\sharefolder\" 2>nul 1>"outputfile.txt"

2>nul предотвращает перенаправление ошибок (STDERR) в текстовый файл. Перенаправляется только вывод, а не ошибки. Таким образом, это означает, что dir не будет перенаправлять что-либо в текстовый файл, если возникнет какая-либо ошибка.

РЕДАКТИРОВАТЬ: Используйте встроенный код powershell для проверки прав доступа к файлу, используйте следующий скрипт:

powershell -command "& {$Folder = "//server/share"; $permission = Get-Childitem $Folder -Recurse | Get-Acl | Foreach {$_.Access} | Where-Object {$_.IdentityReference -match $UserName} | Select-Object IdentityReference,FileSystemRights; If ($permission) {Exit 0} Else {Exit 1}}"
If %errorlevel% equ 0 ( :: Place dir command here ) Else (Echo no permission & exit /b 1)
...