【问题标题】:I need to read a bang from CLI我需要从 CLI 中读取信息
【发布时间】:2015-07-04 20:12:22
【问题描述】:

我有一个简单的 CMD (bat) 文件来更改选定的密码。它已经工作了多年,但突然我需要更改密码,所以它里面有一个砰(!)。我的“set /p”指令有效——但它忽略了 bang 字符并截断了输入字符串(省略了“!”)。我想这与代码页之类的有关,但这超出了我的范围,我不打算深入到这个小小的恶化中。如果有一个简单的答案(比如转义输入),我真的很想知道。如果我必须用超级技术代码重新编写我的命令,我会接受我所拥有的。

提前致谢。

托维安

【问题讨论】:

  • 你能编辑你的帖子并添加你的代码吗!

标签: .net batch-file scripting


【解决方案1】:

试试这个棘手的方法:)

@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
::***********************************************************************************************

【讨论】:

  • 这很好用,我可以根据自己的需要对其进行修改。我还没有使用 PowerShell,所以我不愿意使用我不熟悉的编码。如果我在其他地方需要它,我肯定会保留此代码。谢谢。
【解决方案2】:

您的问题与延迟扩展有关。

如果你执行这段代码

@echo off

    if "%1"=="" (
        setlocal enableextensions disabledelayedexpansion
        echo disabled
    ) else (
        setlocal enableextensions enabledelayedexpansion
        echo enabled
    )

    echo(
    set /p "data=?"
    echo(
    echo -- SET ------------------------
    set data
    echo(
    echo -- normal expansion syntax ----
    echo %data%
    echo(
    echo -- delayed expansion syntax ---
    echo !data!
    echo(

根据参数的存在,延迟扩展活动或非活动将运行,结果将是(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:\>

set data 只是转储环境的内容,可以看到感叹号总是被检索到。

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

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:\>

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

因此,如果如问题中所述,您使用的是 simple 批处理文件,则您需要更改批处理文件,以便它不会使用延迟扩展,除非在需要的地方(如果需要),或者保持它处于活动状态并更改访问变量内容的语法以使用延迟扩展语法 (!var!)。

【讨论】:

  • 我在做家务时总是使用 enabledelayedexpansion。当我更改为 disabledelayedexpansion 时,我的例程按我的意愿工作。我会想进一步研究这一点,并确保我真的理解其中的区别。谢谢。
猜你喜欢
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多