从c ++字符串输入到批处理文件

时间:2016-05-25 15:00:37

标签: c++ batch-file

我想从c ++输入批处理文件变量,但我搜索了许多帮助也无法完成...

    system("bin\\data\\locker.bat");

批处理文件询问输入,但我如何从c ++获取值并插入批处理文件? 我使用c ++打开这个批处理,但是我无法插入使用c ++所需的密码。 批处理:

cls 
@ECHO OFF 
title Folder Private 
if EXIST "HTG Locker" goto UNLOCK 
if NOT EXIST Private goto MDLOCKER 
:CONFIRM 
echo Are you sure you want to lock the folder(Y/N) 
set/p "cho=>" 
if %cho%==Y goto LOCK 
if %cho%==y goto LOCK 
if %cho%==n goto END 
if %cho%==N goto END 
echo Invalid choice. 
goto CONFIRM 
:LOCK 
ren Private "HTG Locker" 
attrib +h +s "HTG Locker" 
echo Folder locked 
goto End 
:UNLOCK 
echo Enter password to unlock folder 
set/p "pass=>" 
if NOT %pass%== PASSWORD_GOES_HERE goto FAIL 
attrib -h -s "HTG Locker" 
ren "HTG Locker" Private 
echo Folder Unlocked successfully 
goto End 
:FAIL 
echo Invalid password 
goto end 
:MDLOCKER 
md Private 
echo Private created successfully 
goto End 
:End

1 个答案:

答案 0 :(得分:0)

1:您应引用if比较的两个操作数。如果操作数扩展为空,那么如果不加引号则会导致语法错误。

2:您应该使用:eof隐式标签,而不是定义自己的End标签。

3:您应该使用echo.而非echo空格分隔符。在您的情况下,这在技术上是不必要的,因为您只有文字消息,但如果消息仅包含变量扩展,例如echo %msg%,则使用echo.%msg%将打印一个空白行,而不是ECHO is on.,而且保持一致是件好事。

4:您应该在运行set /p命令之前初始化set /p目标变量;否则剩余价值可能会破坏剧本。

5:我承认这是主观的,但为了便于阅读,我建议您将脚本的不同部分分开,而不是将其保留为一个完整的代码块。

6:您可以将输入通过管道传输到内部调用set /p的脚本,尽管为批处理脚本添加密码会引发令人不快的安全问题。

这就是我重写代码的方式(使用“pass”作为密码):

cls
@echo off

title Folder Private

if exist "HTG Locker" goto UNLOCK
if not exist Private goto MDLOCKER

:CONFIRM
echo.Are you sure you want to lock the folder(Y/N)
set cho=
set /p "cho=>"
if "%cho%"=="Y" goto LOCK
if "%cho%"=="y" goto LOCK
if "%cho%"=="n" goto :eof
if "%cho%"=="N" goto :eof
echo.Invalid choice.
goto CONFIRM

:LOCK
ren Private "HTG Locker"
attrib +h +s "HTG Locker"
echo.Folder locked
goto :eof

:UNLOCK
echo.Enter password to unlock folder
set pass=
set /p "pass=>"
if not "%pass%"=="pass" goto FAIL
attrib -h -s "HTG Locker"
ren "HTG Locker" Private
echo.Folder Unlocked successfully
goto :eof

:FAIL
echo.Invalid password
goto :eof

:MDLOCKER
md Private
echo.Private created successfully

和C ++程序(使用宏来存储密码;或者,您可以从文件中读取它并调用sprintf()来生成系统命令字符串,这可能是更好的,因为它可以避免存储C ++源代码和二进制代码中的密码:

#include <cstdio>
#include <cstdlib>

#define PASSWORD "pass"

int main(void) {
    system("echo." PASSWORD "| locker.bat");
    return 0;
} // end main()

编译和执行(首先手动运行locker.bat以锁定文件夹,然后运行a.exe解锁):

cl a.cpp
## Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
## Copyright (C) Microsoft Corporation.  All rights reserved.
##
## a.cpp
## Microsoft (R) Incremental Linker Version 14.00.23026.0
## Copyright (C) Microsoft Corporation.  All rights reserved.
##
## /out:a.exe
## a.obj
##
.\locker
## Are you sure you want to lock the folder(Y/N)
## >y
## Folder locked
.\a
## Enter password to unlock folder
## >Folder Unlocked successfully