1

Я основал это по команде:

wmic share where type=0 get name,path

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

Дело в том, что кто-то сделал странным то, что внутри одной папки есть другая (это можно сделать с разрешения файла, но это не так).

Файловая система выглядит так:

share1
- share1.1
- share1.2
share2
-share2.1
--share2.1.1
--share2.1.2
-share2.2
etc...

В этом случае wmic будет перечислять все общие ресурсы отдельно, и я буду делать их резервные копии более одного раза.

Любая идея, как заставить это работать, чтобы проверить только высшую стадию файлового дерева?

1 ответ1

0

Вы можете использовать PowerShell! Сохраните следующий сценарий как файл .ps1 , а затем следуйте разделу «Включение сценариев» в вики-теге PowerShell.

$sharepaths = gwmi -Class 'Win32_Share' | ? {-not $_.Name.EndsWith('$')} | % {$_.Path.ToUpperInvariant()} | sort
$lastroot = $null
ForEach ($path In $sharepaths) {
    If ($lastroot -ne $null -and $path.StartsWith($lastroot)) {Continue}
    $lastroot = $path
    # Run backup command here
}

Он работает, получая все экземпляры Win32_Share WMI (например, ваш пакетный файл), фильтруя их до тех, которые не заканчиваются на $ (который обозначает скрытый общий ресурс), извлекает только путь в верхнем регистре и сортирует список дорожек. Такая сортировка важна, когда мы перебираем список. Если текущий путь начинается с пути последнего "корневого" общего ресурса, мы пропускаем его, поскольку он уже был заархивирован.

Вам необходимо заменить строку комментария # процедурой, которая запускает резервное копирование. В этот момент переменная $path содержит локальный путь к общему ресурсу. Вы также можете запускать утилиты не PowerShell, такие как xcopy или robocopy .

В качестве альтернативы, вы можете заменить эту строку только $path , которая возвращает путь к текущему общему ресурсу вызывающей стороне скрипта. В этой стратегии вы вызываете сценарий PowerShell из пакета, а затем делаете что-то с каждой возвращаемой строкой (т. Е. С каждым путем), используя обычный пакетный цикл. Например, если вы назвали вышеупомянутый скрипт shareroots.ps1 , вы можете запустить его так:

powershell .\shareroots.ps1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .