如何从@开始区分包含@和主机名的密码?

时间:2016-08-27 11:52:00

标签: batch-file scripting

我将以这种格式运行一个包含用户名,密码和主机IP作为参数的批处理脚本:

用户名:密码@主机IP

但我的密码包含@符号。因此它输出无法找到主机。

例如:

batch.bat root:pass@q@10.120.36.65

我如何从批处理脚本中执行此操作?

2 个答案:

答案 0 :(得分:0)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="myTable">
  <thead>
    <tr>
      <th>Food Item</th>
      <th>Portion Size</th>
    </tr>
  </thead>
  <tbody></tbody>
</table>

输出示例:

@echo off
setlocal

for /F "tokens=1,2* delims=:@" %%a in ("%1") do (
   set "user=%%a"
   set "pass=%%b"
   set "host=%%c"
)
for /F "tokens=1* delims=@" %%a in ("%host%") do (
   if "%%b" neq "" (
      set "pass=%pass%@%%a"
      set "host=%%b"
   )
)

echo Username: "%user%"
echo Password: "%pass%"
echo HostIP:   "%host%"

答案 1 :(得分:0)

以下是我的批处理代码,用于将字符串拆分为用户名,密码和主机IP地址或主机名:

@echo off
setlocal EnableDelayedExpansion
if "%~1" == "" goto OutputError

set "NameUser="
set "Password="
set "HostNameIP="

for /F "tokens=1,2 delims=:" %%I in ("%~1") do (
    set "NameUser=%%I"
    set "Password=%%J"
    set "HostNameIP=%%J"
)

rem Is there a colon at all in string and something after the colon?
if "%Password%" == "" goto OutputError

rem Is there at least one At sign in argument string after first colon?
if "%Password:@=%" == "%HostNameIP%" goto OutputError

rem Get host name/IP which is the string after last At sign.
rem The argument string should not end with an At sign.
:GetHostNameIP
set "HostNameIP=%HostNameIP:*@=%"
if "%HostNameIP%" == "" goto OutputError
if not "%HostNameIP:@=%" == "%HostNameIP%" goto GetHostNameIP

rem Get password which is the string between first colon and last
rem At sign which is here the password string with all (hopefully
rem only one) @HostNameIP removed from password string.
set "Password=!Password:@%HostNameIP%=!"

rem Is there a password in argument string?
if "%Password%" == "" goto OutputError

echo The user name is: %NameUser%
echo The password is:  %Password%
echo Host name/IP is:  %HostNameIP%
goto EndBatch

:OutputError
echo.
echo ERROR: username:password@host not specified correct.

:EndBatch
echo.
endlocal
pause

密码字符串可以包含1个甚至更多At符号。由于电子邮件地址被用作密码,因此很可能总是只有1 @,但这对密码不利。

当然,要求使用3个单独的参数(用户名,密码和主机IP地址)执行批处理文件会更容易,因为没有必要将单个参数字符串拆分为3个单独的字符串。

此外,我认为从批处理文件中执行的控制台应用程序需要username:password@hostip。大多数此控制台应用程序还支持另一种变体,即与此连接变体相比,至少为密码指定用户名,密码和主机IP地址,并使用分隔的字符串。如果控制台应用程序支持,那么使用单独指定的3个字符串调用控制台应用程序绝对是一个好主意。

注意USERNAME是一个预定义的环境变量,不应该用于此批处理文件,这是使用NameUser的原因。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /? ...解释%~1(第一个参数字符串,不包含双引号)
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?