无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1437|回复: 42
打印 上一主题 下一主题

[求助] 孤陋寡闻,CMD不支持用户输入含有变量的路径?!

[复制链接]
跳转到指定楼层
1#
发表于 2025-4-28 17:49:45 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nttwqz 于 2025-4-28 22:56 编辑

测试了8.1、10、10PE均如此,非得用for处理一下才行,这么神奇吗?

  1. X:\Windows\SYSTEM32>set /p input=
  2. %temp%\0.log

  3. X:\Windows\SYSTEM32>set input
  4. input=%temp%\0.log

  5. X:\Windows\SYSTEM32>help>%input%
  6. 系统找不到指定的路径。

  7. X:\Windows\SYSTEM32>help>"%input%"
  8. 系统找不到指定的路径。

  9. X:\Windows\SYSTEM32>echo %temp%
  10. X:\Windows\TEMP

  11. X:\Windows\SYSTEM32>set /p input=
  12. %userprofile%\0.log

  13. X:\Windows\SYSTEM32>set input
  14. input=%userprofile%\0.log

  15. X:\Windows\SYSTEM32>help>"%input%"
  16. 系统找不到指定的路径。

  17. X:\Windows\SYSTEM32>for /f "delims=" %a in ('echo %input%') do set input=%~fa

  18. X:\Windows\SYSTEM32>help>"%input%"

  19. X:\Windows\SYSTEM32>
复制代码



测试脚本
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem setlocal enableextensions

  4. pushd %~dp0

  5. echo 请输入%%temp%%\0.log
  6. set /p input=
  7. help>"%input%"
  8. help>"!input!"
  9. rem 有效
  10. call set var=%input%
  11. help>!var!
  12. pause
  13. rem 同样有效
  14. for /f "delims=" %%a in ('echo %input%') do set input=%%~fa
  15. set /?>"%input%"
  16. echo;
  17. echo;
  18. pause
复制代码

点评

这个问题及时  发表于 2025-4-28 22:40
2#
发表于 2025-4-28 18:09:03 | 只看该作者
setlocal 带个什么参数来着,大概能解决之。

点评

扩展和延迟发帖之前试过,无效。  详情 回复 发表于 2025-4-28 22:26
回复

使用道具 举报

3#
发表于 2025-4-28 18:45:26 来自手机 | 只看该作者
不需for

点评

call set input=%input%也可以,但是用for有其它考虑,它同时兼容含双引号和不含双引号的路径输入,避免重复双引号。  详情 回复 发表于 2025-4-28 22:32
回复

使用道具 举报

4#
发表于 2025-4-28 19:35:24 | 只看该作者
楼上图 显示的有点慢
回复

使用道具 举报

5#
 楼主| 发表于 2025-4-28 19:37:45 来自手机 | 只看该作者
窄口牛 发表于 2025-4-28 18:46

你这个=后面是提示语,不是变量值
回复

使用道具 举报

6#
 楼主| 发表于 2025-4-28 20:09:54 来自手机 | 只看该作者
窄口牛 发表于 2025-4-28 20:00
哦,没看懂你的意思,只是抄你的描述。

你用set var=含变量路径,这个是正常生效的,然后你用set /p,输入含变量的路径,比如临时文件夹就会报错,需要再次展开这个变量才能用。
回复

使用道具 举报

7#
发表于 2025-4-28 21:47:24 | 只看该作者
我基本不玩CMD,好像可以的。

点评

留意他的一个描述词、程序中3个重点句子: 1、输入含有变量的路径、 2、set input=%temp%\0.log、 3、X:\Windows\SYSTEM32>help>%input% 4、set /p input= %userprofile%\0.log ==============================  详情 回复 发表于 2025-4-28 22:09
用户输入,set /p,不是set var=这种。  详情 回复 发表于 2025-4-28 21:59
回复

使用道具 举报

8#
发表于 2025-4-28 21:59:26 | 只看该作者
本帖最后由 窄口牛 于 2025-4-29 06:10 编辑

确实win7也一样。

点评

神奇吧!按理说,直接help>%temp%\0.log是可用的,这说明,变量并不需要提前展开,但是神奇的是用户输入就是不行,甚至字符都一样。 虽然set /p的特性就是原样获取用户的一行输入,哪怕输入的是特殊符号~!@#$%^&*  详情 回复 发表于 2025-4-28 22:49
回复

使用道具 举报

9#
 楼主| 发表于 2025-4-28 21:59:33 来自手机 | 只看该作者
lxl1638 发表于 2025-4-28 21:47
我基本不玩CMD,好像可以的。

用户输入,set /p,不是set var=这种。
回复

使用道具 举报

10#
发表于 2025-4-28 22:09:45 | 只看该作者
lxl1638 发表于 2025-4-28 21:47
我基本不玩CMD,好像可以的。

留意他的一个描述词、程序中3个重点句子:
1、输入含有变量的路径、
2、set input=%temp%\0.log、
3、X:\Windows\SYSTEM32>help>%input%
4、set /p input= %userprofile%\0.log
====================================
他 对 set  句子语法,做了几个 不同的 句例,用于尝试理解
回复

使用道具 举报

11#
发表于 2025-4-28 22:14:34 | 只看该作者
留意以下 CMD 窗口下,情况:
========================================
Microsoft Windows [版本 10.0.19044.2364]
(c) Microsoft Corporation。保留所有权利。

C:\Users\Administrator>%userprofile%
'C:\Users\Administrator' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Users\Administrator>cd %userprofile%

C:\Users\Administrator>cd \

C:\>cd %userprofile%

C:\Users\Administrator>
===========================
类似 8# 所说,要  再次展开这个变量才能用。
回复

使用道具 举报

12#
发表于 2025-4-28 22:16:14 | 只看该作者
另外,楼主的系统盘符是 X:
感觉是PE,相对 常规系统,PE缺少很多常规变量

点评

我是正常系统试了好几个,然后才测试的PE。。。  详情 回复 发表于 2025-4-28 22:58
回复

使用道具 举报

13#
发表于 2025-4-28 22:17:59 | 只看该作者
本帖最后由 liangzr1976 于 2025-4-28 22:21 编辑

楼主,使用变量,测试程序之前,要用set 单独指令,显示当前系统所有变量,看看是否存在以下两个变量
%temp%、%userprofile%

=========================
以前,特别是win98、winxp时代,很多软件或所谓高手,一不小心就清除了原有变量。
比如,现在  在 百度搜索中使用 AI问句:
有哪些 bat、cmd语句,会“不小心”清除 变量,你会有一点点感觉
回复

使用道具 举报

14#
 楼主| 发表于 2025-4-28 22:26:47 | 只看该作者
dos时代菜鸟 发表于 2025-4-28 18:09
setlocal 带个什么参数来着,大概能解决之。

扩展和延迟发帖之前试过,无效。

点评

pe环境吧,默认没有%temp%这个变量。需要提前set一下 正常系统下就没问题的。 [attachimg]557692[/attachimg]  详情 回复 发表于 2025-4-28 22:36
回复

使用道具 举报

15#
 楼主| 发表于 2025-4-28 22:32:23 | 只看该作者

call set input=%input%也可以,但是用for有其它考虑,它同时兼容含双引号和不含双引号的路径输入,避免重复双引号。

点评

没有非得,变量嵌套问题  详情 回复 发表于 2025-4-29 08:01
回复

使用道具 举报

16#
发表于 2025-4-28 22:34:32 | 只看该作者
以下正常win10系统CMD语句结果,请参考:

C:\Users\Administrator> echo %aabbcc%
11

C:\Users\Administrator>set aabbcc = %temp% + "ok"

C:\Users\Administrator>set aabbcc
aabbcc=11
aabbcc = C:\Users\ADMINI~1\AppData\Local\Temp + "ok"

C:\Users\Administrator>set aabbccdd = %temp%\ok.txt

C:\Users\Administrator>set aabbccdd
aabbccdd = C:\Users\ADMINI~1\AppData\Local\Temp\ok.txt

C:\Users\Administrator>
回复

使用道具 举报

17#
发表于 2025-4-28 22:36:07 | 只看该作者
nttwqz 发表于 2025-4-28 22:26
扩展和延迟发帖之前试过,无效。

pe环境吧,默认没有%temp%这个变量。需要提前set一下

正常系统下就没问题的。

点评

不是 set var=,是set /p var=这种,需要用户输入的。 前者会自动展开变量,本来就正常。  详情 回复 发表于 2025-4-28 23:01
回复

使用道具 举报

18#
发表于 2025-4-28 22:43:14 | 只看该作者
本帖最后由 liangzr1976 于 2025-4-28 22:55 编辑

1、另外 set /P 指令 的解释:
SET /P variable=[promptString]
/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入

应该不用 /P才对吧?用 /p 是现场实时键盘输入的 意思吧
2、wePE 2.3 没有 help命令
以下是 wePE 2.3 在VBOX虚拟机的测试结果




点评

就是获取用户输入,你直接运行ver>"%temp%\0.log"正确,但是用户输入%temp%\0.log,赋值给变量input,var>"%input%"就会报“系统找不到指定的路径。”  详情 回复 发表于 2025-4-28 23:05
更新了图片,请参考  详情 回复 发表于 2025-4-28 22:56
回复

使用道具 举报

19#
发表于 2025-4-28 22:46:30 来自手机 | 只看该作者
本帖最后由 窄口牛 于 2025-4-29 06:09 编辑

大概是因为set /p不可以打断,因此只能用于批处理,不能在命令行工作。

点评

我这这是方便演示说明问题,已提供测试批处理。。。  详情 回复 发表于 2025-4-28 23:11
回复

使用道具 举报

20#
 楼主| 发表于 2025-4-28 22:49:49 | 只看该作者

神奇吧!按理说,直接help>%temp%\0.log是可用的,这说明,变量并不需要提前展开,但是神奇的是用户输入就是不行,甚至字符都一样。

虽然set /p的特性就是原样获取用户的一行输入,哪怕输入的是特殊符号~!@#$%^&*()_+{}||||:‘"<>nul,set var就会看到就是这串特殊符号,echo和其它命令无法直接正确处理,那是其它命令的事,但就是报错,不解...
回复

使用道具 举报

21#
发表于 2025-4-28 22:56:47 | 只看该作者
liangzr1976 发表于 2025-4-28 22:43
1、另外 set /P 指令 的解释:
SET /P variable=
/P 命令行开关允许将变量数值设成用户输入的一行输入。 ...

更新了图片,请参考.
主要是 PE在虚拟机中 无法安装 增强插件,虚拟机和真实机 之间无法直接复制粘贴
回复

使用道具 举报

22#
 楼主| 发表于 2025-4-28 22:58:53 | 只看该作者
liangzr1976 发表于 2025-4-28 22:16
另外,楼主的系统盘符是 X:
感觉是PE,相对 常规系统,PE缺少很多常规变量

我是正常系统试了好几个,然后才测试的PE。。。
回复

使用道具 举报

23#
 楼主| 发表于 2025-4-28 23:01:33 | 只看该作者
ppll2030 发表于 2025-4-28 22:36
pe环境吧,默认没有%temp%这个变量。需要提前set一下

正常系统下就没问题的。

不是 set var=,是set /p var=这种,需要用户输入的。
前者会自动展开变量,本来就正常。
回复

使用道具 举报

24#
 楼主| 发表于 2025-4-28 23:05:17 | 只看该作者
liangzr1976 发表于 2025-4-28 22:43
1、另外 set /P 指令 的解释:
SET /P variable=
/P 命令行开关允许将变量数值设成用户输入的一行输入。 ...

就是获取用户输入,你直接运行ver>"%temp%\0.log"正确,但是用户输入%temp%\0.log,赋值给变量input,var>"%input%"就会报“系统找不到指定的路径。”
回复

使用道具 举报

25#
 楼主| 发表于 2025-4-28 23:11:15 | 只看该作者
窄口牛 发表于 2025-4-28 22:46
大概是因为set /p不可以打断,因此只能由于批处理,不能在命令行工作。

我这这是方便演示说明问题,已提供测试批处理。。。
回复

使用道具 举报

26#
发表于 2025-4-28 23:12:46 | 只看该作者
本帖最后由 liangzr1976 于 2025-4-28 23:16 编辑

楼主还是试试 WEPE2.3吧,
即使用 set /p input = %temp%\000.log 语句
不过好像有点点小错误,好像无法清除、覆盖旧的 set input的结果


点评

set /p input=这里是提示语句,不是用户输入内容  详情 回复 发表于 2025-4-28 23:16
回复

使用道具 举报

27#
 楼主| 发表于 2025-4-28 23:16:02 | 只看该作者
liangzr1976 发表于 2025-4-28 23:12
楼主还是试试 WEPE2.3吧,
即使用 set /p input = %temp%\000.log 语句
不过好像有点点小错误

set /p input=这里是提示语句,不是用户输入内容
回复

使用道具 举报

28#
发表于 2025-4-28 23:21:27 | 只看该作者
本帖最后由 liangzr1976 于 2025-4-29 06:57 编辑


这个图注,看看是否可以参考理解。

测试时,一定要多关闭 CMD窗口。

前面正确语句 生成的 结果,容易影响后面的判断,
实在不好清除 或关闭,至少用 set input = ""    或 set input =  来标识 或 清除变量值。

1、我的理解是 set /p input= 这个语句,回车后,由于语句本身 没有加入 提示文字,应该是提示文字为空字符串。
然后楼主输入的 %temp%\00.log,会整个作为字符串识别,而不会将 %temp%作为变量展开。

2、但如果 直接   set  input=  %temp%\00.log 再回车,这个时候变量 不作为键盘输入,可直接解释为变量。
3、语句只会展开一次 变量,不可能反复展开嵌套的变量,
     比如 input = %temp%\0000.log
     echo %input%,能展开1次变量 ,是正确的
     但 dir %input%,展开的 结果 实际是 dir “%temp%\0000.log”,只是显示为 dir %temp%\0000.log。这里面嵌套的 %temp% 不会二次展开变量值

===============================
Microsoft Windows [版本 10.0.19044.2364]
(c) Microsoft Corporation。保留所有权利。

C:\Users\Administrator>set /o input
命令语法不正确。

C:\Users\Administrator>set /o input=
命令语法不正确。

C:\Users\Administrator>set /p input=
%temp%\0000.log

C:\Users\Administrator>%temp%\0000.log
'C:\Users\ADMINI~1\AppData\Local\Temp\0000.log' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Users\Administrator>help > %input%
系统找不到指定的路径。

C:\Users\Administrator>help >"%input%"
系统找不到指定的路径。

C:\Users\Administrator>%input%
系统找不到指定的路径。
C:\>md tmp

C:\>cd tmp

C:\tmp>dir %input%
系统找不到指定的文件。

C:\tmp>dir &input
驱动器 C 中的卷是 w7BFSSD
卷的序列号是 DA18-EBFA

C:\tmp 的目录

2025/04/29  06:34    <DIR>          .
2025/04/29  06:34    <DIR>          ..
               0 个文件              0 字节
               2 个目录 17,800,982,528 可用字节
'input' 不是内部或外部命令,也不是可运行的程序
或批处理文件


C:\tmp>dir &input%
驱动器 C 中的卷是 w7BFSSD
卷的序列号是 DA18-EBFA

C:\tmp 的目录

2025/04/29  06:34    <DIR>          .
2025/04/29  06:34    <DIR>          ..
               0 个文件              0 字节
               2 个目录 17,800,982,528 可用字节
'input%' 不是内部或外部命令,也不是可运行的程序
或批处理文件


C:\tmp>echo %input%
%temp%\0123.log
C:\tmp>dir & cd ..
驱动器 C 中的卷是 w7BFSSD
卷的序列号是 DA18-EBFA

C:\tmp 的目录

2025/04/29  06:34    <DIR>          .
2025/04/29  06:34    <DIR>          ..
               0 个文件              0 字节
               2 个目录 17,789,014,016 可用字节
C:\>
====================================








回复

使用道具 举报

29#
发表于 2025-4-29 06:00:13 | 只看该作者
谢谢分享
回复

使用道具 举报

30#
发表于 2025-4-29 07:04:13 来自手机 | 只看该作者
相当于说cmd最好就以bat方式工作,不要逐行一个一个命令执行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-5-9 23:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表