Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我需要从CLI中读到一条消息_.net_Batch File_Scripting - Fatal编程技术网

.net 我需要从CLI中读到一条消息

.net 我需要从CLI中读到一条消息,.net,batch-file,scripting,.net,Batch File,Scripting,我有一个简单的CMD bat文件来更改选定的密码。它已经工作多年了,但突然我需要更改密码,这样它就有一个爆炸!在里面。我的set/p指令可以工作——但它忽略了bang字符并截断了输入字符串,而忽略了!。我想这与代码页有关系,但这超出了我的范围,我不打算深入到这一点上。如果有一个简单的答案,比如逃避输入,我真的很想知道。如果我必须用超技术代码重新编写命令,我将接受我所拥有的 提前谢谢 托维安试试这个巧妙的方法: @echo off Title Password with Bang ! :Check

我有一个简单的CMD bat文件来更改选定的密码。它已经工作多年了,但突然我需要更改密码,这样它就有一个爆炸!在里面。我的set/p指令可以工作——但它忽略了bang字符并截断了输入字符串,而忽略了!。我想这与代码页有关系,但这超出了我的范围,我不打算深入到这一点上。如果有一个简单的答案,比如逃避输入,我真的很想知道。如果我必须用超技术代码重新编写命令,我将接受我所拥有的

提前谢谢

托维安

试试这个巧妙的方法:

@echo off
Title Password with Bang !
:CheckPassword
Mode con cols=60 lines=3
cls & color 0A & echo.
set MyPassword=Bang!
set "psCommand=powershell -Command "$pword = read-host 'Enter your password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
if %MyPassword%==%password% (Goto:Good) else (Goto:Bad)
exit/b
::***********************************************************************************************
:Good
Cls & Color 0A
echo(
echo                        Good Password
TimeOut /T 1 /NoBreak>nul
Exit
::***********************************************************************************************
:Bad
Cls & Color 0C
echo(
echo                        Bad password
TimeOut /T 1 /NoBreak>nul
Goto:CheckPassword
::***********************************************************************************************

您的问题与延迟扩展有关

如果执行此代码

@回音 如果%1== setlocal enableextensions disabledelayedexpansion 回波禁用 其他的 setlocal enableextensions enabledelayedexpansion 启用回声 回响 设置/p数据=? 回响 回声集------------ 设置数据 回响 echo-normal扩展语法-- 回显%数据% 回响 回显延迟扩展语法-- 回响数据 回响 根据参数的存在,将在延迟扩展处于活动或非活动状态时运行,结果将是test.cmd,如上面的代码所示

W:\>test.cmd
disabled

?The ! password

-- SET ------------------------
data=The ! password

-- normal expansion syntax ----
The ! password

-- delayed expansion syntax ---
!data!


W:\>test.cmd x
enabled

?The ! password

-- SET ------------------------
data=The ! password

-- normal expansion syntax ----
The  password

-- delayed expansion syntax ---
The ! password


W:\>
集合数据只是转储环境的内容,您可以看到感叹号总是被检索到

但是,当使用延迟扩展活动但使用正常扩展语法检索变量内容时,批处理解析器将尝试解释!作为变量引用的一部分,其结果是感叹号被删除。如果对变量的引用已完成

W:\>set "test=123"

W:\>test.cmd 1
enabled

?This is a !test!

-- SET ------------------------
data=This is a !test!

-- normal expansion syntax ----
This is a 123

-- delayed expansion syntax ---
This is a !test!


W:\>
您将看到解析器不是如何删除感叹号,而是如何删除完整的变量引用


因此,如果如问题中所述,您正在使用一个简单的批处理文件,那么您需要更改批处理文件,使其不使用延迟扩展,除非需要,否则需要使用延迟扩展,或者将其保持活动状态并更改语法以访问变量的内容,以使用延迟扩展语法!var

你能编辑你的帖子并添加你的代码吗!我总是在客房管理中使用enabledelayedexpansion。当我改为disabledelayedexpansion时,我的例程按我所希望的那样工作。我想进一步研究这一点,确保我真正理解其中的差异。谢谢。这个很好用,我可以根据需要修改它。我还没有接受PowerShell,所以我不愿意使用我不熟悉的编码。我一定会保留这段代码,以防我在其他地方需要它。非常感谢。