[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] winpe3.0下这样的批处理该如何写?

用于判断是否同时满足如下两个条件,如满足则将移动设备盘符赋予变量UFD
1、是否存在移动存储设备
2、移动存储设备根目录下是否存在文件file1

setlocal EnableDelayedExpansion
for /F "usebackq tokens=2 delims==" %%a in (`wmic LogicalDisk where "DriveType='2'"get DeviceID /Value`) do (IF EXIST %%a\file1 set UFD=%%a)
echo %UFD% !UFD!
命令返回:“echo 处于打开/关闭状态”

下面这个命令执行却正常
setlocal EnableDelayedExpansion
for /F "usebackq tokens=2 delims==" %%a in (`wmic LogicalDisk where "DriveType='2'"get DeviceID /Value`) do echo %%a
没有行不行?

一般pe下没有WMIC
命令少个空格...
echo 建议改成echo,或echo=
如果可以正常使用wmic建议重新加载一次for过滤空行
示例:set "UFD="&&for /F "usebackq tokens=2 delims==" %%a in (`wmic LogicalDisk where "DriveType='5'" get DeviceID /Value`)do for /f "delims=" %%a in ("%%a")do set "UFD=%%a"
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

回复 1# tjx_nj


    没在PE上用过命令, 不过你IF判断有没有的时候 怎么没有引号 又不是数字,这里报错的可能性很大

TOP

回复  tjx_nj


    没在PE上用过命令, 不过你IF判断有没有的时候 怎么没有引号 又不是数字,这里报错 ...
miqilaosu 发表于 2019-6-30 11:08


引号我也试过,也不行。
没有行不行?

TOP

本帖最后由 tjx_nj 于 2019-6-30 14:07 编辑
一般pe下没有WMIC
命令少个空格...
echo 建议改成echo,或echo=
如果可以正常使用wmic建议重新加载一次fo ...
/zhqsystem/zhq 发表于 2019-6-29 23:35


1、PE中我添加了pe-wmi的包,虽然与win7环境不完全一致,但是我的这个命令是在pe下可以得到需要的数据的
2、关于过滤空行的问题,我贴子里第二条命令的返回值就是没有空行的,你的环境是什么?怎么会有空行?
没有行不行?

TOP

回复 2# /zhqsystem/zhq


    我通常用find来过滤空行了

TOP

命令出错的部分很明显是  IF EXIST之后的那一段。。
代码虽然没帮你测试,但你可以参考下这样的查错思路,,,
1,把IF EXIST 代码去掉,直接SET 查看结果,
2,%%A 得到的变量是什么,我不清楚但排查可以从符号去尝试一下。
3,另外编写一个脚本,就写IF EXIST 目标盘符:\目录  ECHO  结果。
4,PE系统是预执行系统,缺乏很多完整的CMD,语法,命令,变量,不同的PE版本支持的命令,变量也不同,不便采取高级脚本写法,最好就写一些通俗或低级命令写法。

TOP

工作环境中的一段类似应用,仅供参考
  1. for /f %%i in ('mountvol ^|find ":\"') do (
  2. setlocal enabledelayedexpansion
  3. set drv=%%i
  4. set drv=!drv:~0,1!
  5. if [%%i] NEQ [%~d0\] (
  6. if not exist !drv!:\Deploy (
  7. robocopy !drv!:\ .\Backup\%username%\!drv!_Drive /s /e /xj /xa:s /mt:15 /np /tee /njh /njs /v /log+:Backup\%username%\%username%_backuplog.log /r:0 /w:0 /xa:sh /xd config.msi boot $WINDOWS.~BT $RECYCLE.BIN "Documents and Settings" MSOCache ProgramData Recovery "System Volume Information" users Windows windows.old "Program Files" "Program Files (x86)" /xf pagefile.sys hiberfil.sys swapfile.sys
  8. attrib -s -h .\Backup\%username%\!drv!_Drive
  9. )
  10. )
  11. set drv=
  12. endlocal
  13. )
复制代码

TOP

回复 8# kingshui


这个代码可以借鉴,谢谢!
折腾了几天终于解决,原因是if exist %%afile1 echo ...,不能这样写,要写成下面这样:
if exist %file% ...

setlocal EnableDelayedExpansion
for /F "usebackq tokens=2 delims==:" %%a in (`wmic LogicalDisk where "DriveType='2'"get DeviceID /Value`) do (
set UFD=%%a
set File=%UFD%:\file1
IF EXIST %file% commander...
)

也就是说if之后的判断条件虽然可以是变量但是不可以嵌套运算,必须提前准备好。
另外我之前的for语句delims分隔符没有“:”,现在增加了。原因是当半角冒号作为变量值的一部分时,如何该变量参加变量组合的时候系统会把变量里的半角冒号当作控制字符,而不是普通字符,这样就得不到需要的结果。
没有行不行?

TOP

本帖最后由 WHY 于 2019-7-7 19:55 编辑

回复 9# tjx_nj


    解释的不太靠谱,脚本也是错误的。

for + WMIC 命令获取的变量值 %%a 结尾有一个不可见的特殊字符(0x0D,\r,vbCr),也就是“回车符”。
因为 %%a 包含了特殊字符,使得 %%a\file1 这个路径非法,if exist 语句条件不成立,变量 UFD 始终不会被赋值。

要验证这个特殊字符是否存在,只需要运行一下:
  1. for /F "usebackq tokens=2 delims==" %%a in (`wmic LogicalDisk get DeviceID /Value`) do (echo;[%%a]>>D:\1.txt)
复制代码
然后用任意一款16进制文本编辑软件打开 D:\1.txt 查看即可。

2楼给出的方案可以满足你的要求,但你没有认真看,过早地被你忽略了。
还有一种办法,用 %%~da 变量扩展,去掉非法字符:
  1. for /F "usebackq tokens=2 delims==" %%a in (`wmic LogicalDisk where "DriveType='2'" get DeviceID /Value`) do (IF EXIST %%~da\file1 set UFD=%%~da)
  2. echo;%UFD%
复制代码

TOP

返回列表