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

问题描述 投票:0回答:1

我正在创建批处理以自动执行初始设置。我注意到批处理文件输入与用户输入不同。当我使用批处理文件输入作为PIN,然后尝试手动输入时,它不匹配。我已经尝试使用[space] 1111这样的空格进行输入,但是它也不是有效的PIN。我知道有一种方法可以设置另一个文件中的用户输入,但是我想将所有这些都放在一个批处理文件中。

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

命令行输出:

C:\ windows \ system32>(Echo 1111&Echo 1111&Echo 1111&Echo 1111)| ctconf

初始化管理令牌SO和管理员PIN(设备0,序列号:0000):请输入新的Admin SO PIN:请确认新的Admin SO PIN:

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

echo命令应将PIN设置为1111。当我去登录手动,这不是正确的PIN码。我认为echo正在添加间隔或更改输入PIN。

C:\ windows \ system32> ctkmu l -s1

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

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

标签= AdminToken(0000)标志= 0x1001064d(RNG登录请求用户PIN初始化时钟令牌令牌初始化双重加密用户低)

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

ctkmu:列表操作失败0xa0-PIN不正确

C:\ windows \ system32>

如果我重新开始过程并手动输入PIN 1111,那么它将起作用:

命令行输出:

C:\ windows \ system32> ctconf

初始化管理令牌SO和管理员PIN(设备0,序列号:0000):请输入新的Admin SO PIN:请确认新的Admin SO PIN:

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

C:\ windows \ system32> ctkmu l -s1

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

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

标签= AdminToken(0000)标志= 0x1000064d(RNG登录请求用户PIN初始化密码令牌初始双加密)

公共和私人对象:广告位0-广告位HIMK-SECRET_KEY DES3适配器配置-适配器FwUpgradeCert-证书RSA(受信任)

C:\ windows \ system32>

谢谢您的建议。

batch-file input cmd echo
1个回答
0
投票

您注意到,从管道|读取标准输入与从文件<读取是不同的行为。

我没有ctconf可以测试,尽管我知道Python 3在管道方面具有类似的行为。因此,我将展示一些适用于ctconf的Python示例。

批处理文件:

@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文件只是显示输出的一个示例,因此,请关注批处理文件代码,以了解如何使用管道|消除传递的尾随空间。

这是我通过管道解决尾随空间的方法,也许还存在其他甚至更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.