我想从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
答案 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