块内的批处理文件变量

时间:2016-07-20 08:46:50

标签: batch-file

我试图通过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%

我尝试了很多变化,但我无法正确设置。欢迎任何建议!

1 个答案:

答案 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;
  • 的输出
  • 使用delayed expansiondir /B中的构建文件路径传递给FILE,因为在同一代码块中写入和读取变量时需要这样做;正常扩展将返回命令解释器解析整个块时出现的值;我在循环结构中启用了延迟扩展,以避免在文件名中丢失感叹号,因为在读取netsh wlan add profilefor变量时,需要禁用延迟扩展以不丢失此类字符;
  • 实际上是临时变量%%F,如果您可以保证每个驱动器上有一个文件可用,则不需要延迟扩展;如果是这种情况,请删除FILEsetlocal命令行,将endlocal命令行移到最里面的netsh循环中,将for /F %%F替换为!FILE!并删除%%I\%%F命令行;