我试图通过wmic logicaldisk get caption^,description^,drivetype 2^>NUL
检测包含可移动媒体(即记忆棒)的驱动器号,然后我想使用dir
来获取驱动器上的文件名(应该只有一个,但我不知道名称是什么)并将该文件名传递给netsh wlan add profile
。
我有这个我写过的批处理文件:
@echo off
for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,description^,drivetype 2^>NUL`) do (
if %%l equ 2 (
SET file= | dir %%i /b
echo %%i\%file%
netsh wlan add profile filename="%%i\%file%" user=all
)
)
pause
我希望输出为D:\%some file%.xml
,但我只得到D:
。似乎没有正确设置变量%file%
。
我尝试了很多变化,但我无法正确设置。欢迎任何建议!
答案 0 :(得分:3)
虽然我不知道你想要完成什么,但我决定提供一个修改过的脚本,其中修复了一些问题。一旦你edit提出问题并澄清它,我会相应地更新我的答案。
所以这是更新后的代码:
@echo off
setlocal EnableDelayedExpansion
for /F "skip=1 delims=" %%L in ('
2^> nul wmic LogicalDisk ^
WHERE ^(DriveType^=2^) ^
GET Caption^,Description
') do (
for /F "tokens=1,*" %%I in ("%%L") do (
set file=myfile.xml
echo %%I\!file!
)
)
endlocal
pause
wmic
的{{1}}选项从skip
跳过标题行; for /F
命令行实施了WHERE
子句,以过滤掉wmic
,因此不需要DriveType
条件; if
将令牌Description
置于最后位置,因此可以使用DriveType
令牌字符串for /F
,因为属性值可能包含分隔符(空格)它自己的(虽然*
未在循环中使用); %%J
循环,以便首先从for /F
转换wmic
的Unicode输出中的人工制品; for /F
设置为常量值file
,以演示delayed expansion(另请参阅myfile.xml
命令);当然setlocal
可以在此循环之外预先设置; file
,因为我不知道这是打算做什么的; 在问题revised之后并澄清我可以为所请求的任务提供解决方案:
SET file= | dir %%i /b
@echo off
for /F "skip=1 delims=" %%L in ('
2^> nul wmic LogicalDisk WHERE ^(DriveType^=2^) GET Caption
') do (
for /F "tokens=1" %%I in ("%%L") do (
for /F "eol=| delims=" %%F in ('dir /B "%%I\"') do (
set "FILE=%%I\%%F"
)
setlocal EnableDelayedExpansion
netsh wlan add profile filename="!FILE!" user=all
endlocal
)
)
pause
命令行中删除了属性Description
,因为它仍未使用; wmic
循环以捕获for /F
; dir /B
中的构建文件路径传递给FILE
,因为在同一代码块中写入和读取变量时需要这样做;正常扩展将返回命令解释器解析整个块时出现的值;我在循环结构中启用了延迟扩展,以避免在文件名中丢失感叹号,因为在读取netsh wlan add profile
等for
变量时,需要禁用延迟扩展以不丢失此类字符; %%F
,如果您可以保证每个驱动器上有一个文件可用,则不需要延迟扩展;如果是这种情况,请删除FILE
和setlocal
命令行,将endlocal
命令行移到最里面的netsh
循环中,将for /F %%F
替换为!FILE!
并删除%%I\%%F
命令行;