无忧启动论坛

标题: 孤陋寡闻,CMD不支持用户输入含有变量的路径?! [打印本页]

作者: nttwqz    时间: 2025-4-28 17:49
标题: 孤陋寡闻,CMD不支持用户输入含有变量的路径?!
本帖最后由 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
复制代码

作者: dos时代菜鸟    时间: 2025-4-28 18:09
setlocal 带个什么参数来着,大概能解决之。
作者: szwp    时间: 2025-4-28 18:45
不需for
作者: 绿光科技    时间: 2025-4-28 19:35
楼上图 显示的有点慢
作者: nttwqz    时间: 2025-4-28 19:37
窄口牛 发表于 2025-4-28 18:46

你这个=后面是提示语,不是变量值
作者: nttwqz    时间: 2025-4-28 20:09
窄口牛 发表于 2025-4-28 20:00
哦,没看懂你的意思,只是抄你的描述。

你用set var=含变量路径,这个是正常生效的,然后你用set /p,输入含变量的路径,比如临时文件夹就会报错,需要再次展开这个变量才能用。
作者: lxl1638    时间: 2025-4-28 21:47
我基本不玩CMD,好像可以的。


作者: 窄口牛    时间: 2025-4-28 21:59
本帖最后由 窄口牛 于 2025-4-29 06:10 编辑

确实win7也一样。
作者: nttwqz    时间: 2025-4-28 21:59
lxl1638 发表于 2025-4-28 21:47
我基本不玩CMD,好像可以的。

用户输入,set /p,不是set var=这种。
作者: liangzr1976    时间: 2025-4-28 22:09
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  句子语法,做了几个 不同的 句例,用于尝试理解
作者: liangzr1976    时间: 2025-4-28 22:14
留意以下 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# 所说,要  再次展开这个变量才能用。

作者: liangzr1976    时间: 2025-4-28 22:16
另外,楼主的系统盘符是 X:
感觉是PE,相对 常规系统,PE缺少很多常规变量
作者: liangzr1976    时间: 2025-4-28 22:17
本帖最后由 liangzr1976 于 2025-4-28 22:21 编辑

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

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

作者: nttwqz    时间: 2025-4-28 22:26
dos时代菜鸟 发表于 2025-4-28 18:09
setlocal 带个什么参数来着,大概能解决之。

扩展和延迟发帖之前试过,无效。
作者: nttwqz    时间: 2025-4-28 22:32
szwp 发表于 2025-4-28 18:45
不需for

call set input=%input%也可以,但是用for有其它考虑,它同时兼容含双引号和不含双引号的路径输入,避免重复双引号。
作者: liangzr1976    时间: 2025-4-28 22:34
以下正常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>
作者: ppll2030    时间: 2025-4-28 22:36
nttwqz 发表于 2025-4-28 22:26
扩展和延迟发帖之前试过,无效。

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

正常系统下就没问题的。


作者: liangzr1976    时间: 2025-4-28 22:43
本帖最后由 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虚拟机的测试结果





作者: 窄口牛    时间: 2025-4-28 22:46
本帖最后由 窄口牛 于 2025-4-29 06:09 编辑

大概是因为set /p不可以打断,因此只能用于批处理,不能在命令行工作。
作者: nttwqz    时间: 2025-4-28 22:49
窄口牛 发表于 2025-4-28 21:59
确实win7夜一样。

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

虽然set /p的特性就是原样获取用户的一行输入,哪怕输入的是特殊符号~!@#$%^&*()_+{}||||:‘"<>nul,set var就会看到就是这串特殊符号,echo和其它命令无法直接正确处理,那是其它命令的事,但就是报错,不解...
作者: liangzr1976    时间: 2025-4-28 22:56
liangzr1976 发表于 2025-4-28 22:43
1、另外 set /P 指令 的解释:
SET /P variable=
/P 命令行开关允许将变量数值设成用户输入的一行输入。 ...

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

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

我是正常系统试了好几个,然后才测试的PE。。。
作者: nttwqz    时间: 2025-4-28 23:01
ppll2030 发表于 2025-4-28 22:36
pe环境吧,默认没有%temp%这个变量。需要提前set一下

正常系统下就没问题的。

不是 set var=,是set /p var=这种,需要用户输入的。
前者会自动展开变量,本来就正常。
作者: nttwqz    时间: 2025-4-28 23:05
liangzr1976 发表于 2025-4-28 22:43
1、另外 set /P 指令 的解释:
SET /P variable=
/P 命令行开关允许将变量数值设成用户输入的一行输入。 ...

就是获取用户输入,你直接运行ver>"%temp%\0.log"正确,但是用户输入%temp%\0.log,赋值给变量input,var>"%input%"就会报“系统找不到指定的路径。”
作者: nttwqz    时间: 2025-4-28 23:11
窄口牛 发表于 2025-4-28 22:46
大概是因为set /p不可以打断,因此只能由于批处理,不能在命令行工作。

我这这是方便演示说明问题,已提供测试批处理。。。
作者: liangzr1976    时间: 2025-4-28 23:12
本帖最后由 liangzr1976 于 2025-4-28 23:16 编辑

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



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

set /p input=这里是提示语句,不是用户输入内容
作者: liangzr1976    时间: 2025-4-28 23:21
本帖最后由 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:\>
====================================









作者: ebaqiang    时间: 2025-4-29 06:00
谢谢分享
作者: 窄口牛    时间: 2025-4-29 07:04
相当于说cmd最好就以bat方式工作,不要逐行一个一个命令执行。
作者: szwp    时间: 2025-4-29 08:01
nttwqz 发表于 2025-4-28 22:32
call set input=%input%也可以,但是用for有其它考虑,它同时兼容含双引号和不含双引号的路径输入,避免 ...

没有非得,变量嵌套问题
作者: 709601484    时间: 2025-4-29 10:59
系统什么版本
作者: yhage    时间: 2025-4-29 16:06
powershell不强大吗?
作者: liangzr1976    时间: 2025-4-29 16:57
yhage 发表于 2025-4-29 16:06
powershell不强大吗?

百度AI说:
在Windows PE(Preinstallation Environment)环境下,通常可以使用PowerShell 7。‌

Windows PE是一个轻量级的操作系统,主要用于系统部署、恢复、维修和故障排除等任务。虽然Windows PE默认只集成了基本的命令行工具和脚本环境(如CMD和批处理脚本),但可以通过一些额外的工作将PowerShell 7集成到Windows PE环境中,从而提供更强大的命令行工具和自动化脚本支持‌
1。

要将PowerShell 7集成到Windows PE中,可以按照以下步骤进行:

获取Windows PE镜像:通过Windows ADK(Assessment and Deployment Kit)创建Windows PE环境。
下载并安装PowerShell 7:从GitHub或通过适当的包管理工具(如winget、choco等)下载适合Windows PE版本的PowerShell 7。
集成PowerShell 7到Windows PE:使用DISM(Deployment Imaging Servicing and Management)工具将PowerShell 7添加到自定义的Windows PE镜像中‌
1。
通过这些步骤,系统管理员可以在Windows PE环境下使用PowerShell 7,从而进行更复杂的系统管理和自动化任务。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3