使用Echo的批处理文件用户输入与手动输入不同



我正在创建批次以自动化初始设置。我注意到批处理文件输入与用户输入不同。当我使用批处理文件输入PIN,然后尝试手动输入时,它不匹配。我试过用空格输入,比如[space]1111,但它也不是有效的PIN。我知道有一种方法可以从另一个文件设置用户输入,但我希望将其全部放在一个批处理文件中。

(Echo 1111&Echo 1111&Echo 1111&Echo 1111)|ctconf 

命令行输出:

C:\windows\system32>(Echo 1111&Echo 1111amp;Echo 111(|ctconf

正在初始化管理员令牌SO和管理员PIN(设备0,S/N:0000(:请输入新管理员SO pin:请确认新管理员SO pin:

请输入新的管理员密码:请确认新管理员密码:

echo命令应将PIN设置为1111。当我去登录时手动地,它不是正确的PIN。我认为echo正在添加空格或更改输入PIN。

C: \windows\system32>ctkmu l-s1

是否要查看私人(用户(对象[y/N]:y

请为插槽1:中的令牌输入用户PIN

标签=AdminToken(0000(标志=0x1001064d(RNG LOGIN-REQ USER-PIN-INIT CLOCK TOKEN-INIT双加密USER-LOW(

无法让用户登录(0xa0-PIN不正确(

ctkmu:列表操作失败0xa0-PIN错误

C: \windows\system32>

如果我重新开始处理并手动输入PIN 1111,那么它就工作了:

命令行输出:

C:\windows\system32>ctconf

正在初始化管理员令牌SO和管理员PIN(设备0,S/N:0000(:请输入新管理员SO pin:请确认新管理员SO pin:

请输入新的管理员密码:请确认新管理员密码:

C: \windows\system32>ctkmu l-s1

是否要查看私人(用户(对象[y/N]:y

请为插槽1:中的令牌输入用户PIN

Label=AdminToken(0000(Flags=0x1000064d(RNG LOGIN-REQ USER-PIN-INIT CLOCK TOKEN-INIT DUAL-CRYPTO(

公用和专用对象:插槽0-插槽HIMK-SECRET_KEY DES3适配器配置-适配器FwUpgradeCert-证书RSA(可信(

C: \windows\system32>

感谢您的建议。

正如您所注意到的,从管道|读取stdin与从文件<读取stdin是不同的行为。

我没有ctconf可以测试,尽管我知道Python 3在管道方面也有类似的行为。因此,我将展示一些Python的例子,这些例子可能与ctconf一起使用。

批处理文件:

@prompt $G$S
rem 1. No escaping.
(echo 1111&echo 1111&echo 1111&echo 1111) | py test1.py
rem 2. Escape ampersand and end with a dummy command.
(echo 1111^&echo 1111^&echo 1111^&echo 1111^&echo:>nul) | py test1.py
rem 3. Escape ampersand, newline and end with a dummy command.
(   echo 1111^&^
echo 1111^&^
echo 1111^&^
echo 1111^&^
echo:>nul
) | py test1.py
pause

Python文件test1.py:

# Use these inputs to catch the stdin.
in1 = input('input1: ')
in2 = input('input2: ')
in3 = input('input3: ')
in4 = input('input4: ')
# Add a newline as inputs display no newlines.
print('n---')
# Repr is representation so the space can be seen.
print(repr(in1), repr(in2), repr(in3), repr(in4))

运行批处理文件,输出为:

> rem 1. No escaping.
> (echo 1111  & echo 1111  & echo 1111  & echo 1111 )  | py test1.py
input1: input2: input3: input4:
---
'1111 ' '1111 ' '1111 ' '1111 '
> rem 2. Escape ampersand and end with a dummy command.
> (echo 1111&echo 1111&echo 1111&echo 1111&echo: 1>nul )  | py test1.py
input1: input2: input3: input4:
---
'1111' '1111' '1111' '1111'
> rem 3. Escape ampersand, newline and end with a dummy command.
> (echo 1111&    echo 1111&    echo 1111&    echo 1111&    echo: 1>nul )  | py test1.py
input1: input2: input3: input4:
---
'1111' '1111' '1111' '1111'
> pause
Press any key to continue . . .

注意:输出中的单引号只是字符串值的表示,而不是值本身。

第一个例子没有进行转义,就像在OP中一样,输出有一个尾部空间,即'1111 '

第二个示例转义"与"符号,并使用一个伪命令来允许最后一个转义的"与"字符存在,否则将获得带有最后一个输出值的尾部空格。

第三个示例与第二个示例类似,但转义了换行符,因此可以逐行定位值以便于查看。

Python文件只是显示输出的一个示例,因此请关注Batch文件代码,了解如何使用管道|消除传递的尾部空间。

这就是我用管道解决尾部空间的方法,也许还有其他更好的解决方案。

相关内容

最新更新