![如何在 wmic 中过滤共享](https://linux22.com/image/1515325/%E5%A6%82%E4%BD%95%E5%9C%A8%20wmic%20%E4%B8%AD%E8%BF%87%E6%BB%A4%E5%85%B1%E4%BA%AB.png)
我通过命令建立了它:
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
您可以使用 PowerShell!将以下脚本保存为.ps1
文件,然后按照启用脚本部分中的说明进行操作PowerShell 标签 wiki。
$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 实例(例如批处理文件),过滤掉不以 a 结尾的实例$
(这表示隐藏共享),只提取全大写路径,然后对路径列表进行排序。当我们遍历列表时,这种排序很重要。如果当前路径以最后一个“根”共享的路径开头,我们会跳过它,因为它已经备份了。
您需要将#
注释行替换为运行备份的程序。此时,$path
变量包含共享的本地路径。您也可以在其中运行非 PowerShell 实用程序,例如xcopy
或。robocopy
或者,您可以用 替换该行$path
,它将当前共享的路径返回给脚本的调用者。在该策略中,您将从批处理中调用 PowerShell 脚本,然后使用普通批处理循环对其返回的每一行(即每个路径)执行某些操作。例如,如果您将上述脚本命名为shareroots.ps1
,则可以像这样运行它:
powershell .\shareroots.ps1