我尝试按照这个主题制作一个脚本
batch script to find drive letter of a mounted device
但没有真正的成功。
这是剧本:
SETLOCAL EnableDelayedExpansion
for /f "usebackq tokens=1,*" %%i in (`fsutil fsinfo drives`) do (
if exist %%j dir /S /D "%%j*hurrdurr.txt" >> fud_india.com_%computername%.txt
)
pause
问题是我得到的结果,但只有1个驱动器号......
任何人都可以在这里帮忙吗?
答案 0 :(得分:3)
@echo off
setlocal enableextensions disabledelayedexpansion
>"fud_india.com_%computername%.txt" 2>nul (
for /f "delims=: tokens=1,*" %%a in ('fsutil fsinfo drives') do (
for %%c in (%%b) do vol %%~dc && dir /s /d "%%~dc\hurrdurr.txt"
)
)
for /f
只处理行,在这种情况下是fsutil
命令的输出,并且能够使用指定的分隔符集将这些行拆分为标记。由于fsutil
返回一行中的所有驱动器,如
Drives: C:\ D:\ E:\
并且不知道线路中可以有多少驱动器,我们不能(或多或少)指示我们想要多少令牌。因此,我们需要获取行,分隔标题,获取列表并迭代列表中的元素(驱动器)
第一步是将标题与驱动器列表分开。这可以通过for /f %%a
和tokens
条款直接在delims
中完成。我们将使用冒号作为分隔符来分割标记中的行。
我们正在请求两个令牌:第一个令牌(%%a
)将文本存储到第一个分隔符(标题),第二个令牌(%%b
)将存储该行的其余部分(这是令牌子句中*
的含义)
使用%%b
中存储的驱动器列表,我们需要一种迭代它的方法。这就是for %%c in (%%b) ...
的原因。展开%%b
时,生成的命令将为
for %%c in (C:\ D:\ E:\) do ...
对于列表中的每个元素,vol
命令用于确定驱动器是否可用,如果未设置errorlevel,则执行dir
命令。
由于vol
命令只接受没有路径的驱动器引用,我们需要从列表中的元素中删除结尾反斜杠,因此我们不使用%%c
而是直接使用{{1} },即%%~dc
中引用的元素的驱动器。
完整的%%c
循环括在括号中并重定向,因此输出文件只需要打开/关闭一次。
答案 1 :(得分:1)
您的%%j
包含C:\ D:\ E:\ F:\ G:
(对我来说),这会让您if
:
if exist C:\ D:\ E:\ F:\ G:\ dir ...
明显错误的语法。
我建议另一种方法(wmic):
for /f "skip=1" %%i in ('wmic logicaldisk get caption') do (
dir /s /d %%i\*hurrdurr.txt" >>fud_india.com_%computername%.txt 2>nul
)
通过删除if exist
,您可以避免使用GUI-Box“无媒体”; >nul
只是将dir
- 错误发送给必杀技。