Board logo

标题: [其他] [已解决]bat中如何转义并实现如下代码 [打印本页]

作者: shootman2    时间: 2015-3-28 23:05     标题: [已解决]bat中如何转义并实现如下代码

本帖最后由 shootman2 于 2015-3-31 15:21 编辑

@echo off
setlocal enabledelayedexpansion
set deploy_cmd_file=d:\appDeploy.txt
echo off>"%deploy_cmd_file%"
set fileList=d:\WebContent_20150328.zip
set fileName=WebContent_20150328.zip
for %%x in ("cd /home/weblogic/bea" "put "^"%fileList%^" "^"%fileName%^"" "exit") do echo %%~x>>"%deploy_cmd_file%" 这段代码调试有问题

我想实现最后写入到文件中的内容是这样的

cd /home/weblogic/bea
put "d:\WebContent_20150328.zip" "WebContent_20150328.zip"       要加上双引号
exit

这具体该怎么实现呢?求大神帮助!!!
作者: bailong360    时间: 2015-3-28 23:26

本帖最后由 bailong360 于 2015-3-29 08:44 编辑

回复 4# shootman2




bailong360发表于:  2015-03-29  08:42

符合要求否?

奇怪,用[code]发出去总是挤在一行上面...难道是编辑器问题??
作者: shootman2    时间: 2015-3-28 23:38

回复 2# bailong360


    good job!very thank you!!!
作者: shootman2    时间: 2015-3-29 00:11

回复  bailong360


    good job!very thank you!!!
shootman2 发表于 2015-3-28 23:38



    好像还不对哦!关键的那个for循环,只能写成这样
for %%x in (
***
***
) do ****
写成是 for %%x in (*** ***) do *** 就报错了!

而且就即便是写成了大神你所说的这种的话,一旦路径中带有空格,就自动转成是换行了!

麻烦大神再给帮忙看看!
作者: shootman2    时间: 2015-3-29 12:05

回复 2# bailong360


    大神,你写的代码太好了!我又学到一招。可是实际在我的代码中,还有这么点缺陷。

其实我的代码中,让你帮忙写的这段只是其中的一部分,它的外层还有一层for循环。功能必须启用变量延迟,
所以当按照你的代码修改后,还是有问题,我现在就把完整的代码发给你,麻烦你再帮我改改。先谢谢了!

@echo off
setlocal enabledelayedexpansion
for /l %%a in (1 1 100) do (
  set deploy_cmd_file=d:\appDeploy_%%a.txt
  set fileList=d:\WebContent_201503 28_%%a.zip
  set fileName=WebContent_20150328_%%a.zip
  for %%x in ("cd /home/weblogic/bea" "put "!!fileList%!!" "!!fileName%!!"" "exit") do call echo %%~x>>"%deploy_cmd_file%"
)
pause
作者: bailong360    时间: 2015-3-29 12:07

回复 5# shootman2


   这个地方不需要变量延迟

bailong360发表于:  2015-03-29  12:08

作者: shootman2    时间: 2015-3-29 12:19

回复 6# bailong360


    打印还是有问题,必须要用到变量延迟。

rem setlocal enabledelayedexpansion
for /f "usebackq eol=# tokens=1-14 delims=|" %%a in ("%host_list_file%") do (
        set fileList=
        set fileName=
        set /a filesCnt=0
        for /f "delims=" %%x in ('dir /a /b /s "%deploy_app_folder%\*.zip"') do set fileList=%%x&set fileName=%%~nxx&set /a filesCnt+=1
        if !filesCnt! equ 0 (
                echo 没有应用可以发布
        ) else if !filesCnt! equ 1 (
                echo off>"%deploy_cmd_file%"
                for %%x in ("cd %%g" "put "%%fileList%%" "%%fileName%%"" "exit") do echo %%~x>>"%deploy_cmd_file%"
                psftp %%c -l %%d -pw %%e<"%deploy_cmd_file%"
                plink -l %%d -pw %%e %%d@%%c "unzip !fileName!;A"
                echo 主机 %%a.%%b 上的服务 %%f 的应用已经发布
        ) else if !filesCnt! gtr 1 (
                echo 应用程序包有多个,不知道该发布哪个
        )
)
echo 按任意键退出
pause>nul
作者: bailong360    时间: 2015-3-29 12:28

本帖最后由 bailong360 于 2015-3-29 18:50 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "usebackq eol=# tokens=1-14 delims=|" %%1 in ("%host_list_file%") do (
  4.         set fileList=
  5.         set fileName=
  6.         set /a filesCnt=0
  7.         for /f "delims=" %%x in ('dir /a /b /s "%deploy_app_folder%\*.zip"') do set fileList=%%x&set fileName=%%~nxx&set /a filesCnt+=1
  8.         if !filesCnt! equ 0 (
  9.                 echo 没有应用可以发布
  10.         ) else if !filesCnt! equ 1 (
  11.                 echo off>"%deploy_cmd_file%"
  12.                 for %%x in ("cd %%g" "put "%%fileList%%" "%%fileName%%"" "exit") do echo %%~x>>"%deploy_cmd_file%"
  13.                 psftp %%3 -l %%4 -pw %%5<"%deploy_cmd_file%"
  14.                 plink -l %%4 -pw %%5 %%d@%%3 "unzip !fileName!;A"
  15.                 echo 主机 %%1.%%2 上的服务 %%6 的应用已经发布
  16.         ) else if !filesCnt! gtr 1 (
  17.                 echo 应用程序包有多个,不知道该发布哪个
  18.         )
  19. )
  20. echo 按任意键退出
  21. pause>nul
复制代码

作者: shootman2    时间: 2015-3-29 12:41

回复 8# bailong360


    还是不行的,最外层的语句  for /f "usebackq eol=# tokens=1-14 delims=|" %%a in ("%host_list_file%") do (     中,有tokens=1-14,也就是说
有%%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i,%%j,%%k,%%l,%%m,%%n

这一句中 for %%x in ("cd %%g" "put "%%fileList%%" "%%fileName%%"" "exit") do echo %%~x>>"%deploy_cmd_file%"   %%fileList被系统当做 %%f +ilelist处理了!
作者: 523066680    时间: 2015-3-29 12:54

回复 8# bailong360


    论坛也该内部支持一下彩色代码了,给论坛放个模块的事儿
作者: bailong360    时间: 2015-3-29 13:43

回复 9# shootman2


    可以把那个%%a改成%%1,或者%%A
作者: bailong360    时间: 2015-3-29 13:44

回复 10# 523066680


    那样似乎十分有趣~并且实用
作者: shootman2    时间: 2015-3-29 18:21

回复 12# bailong360


    大神,请继续帮助!
作者: pcl_test    时间: 2015-3-29 19:29

回复 13# shootman2

把你的完整代码发下,发现你发出的三段代码都不完整,不好整合
作者: CrLf    时间: 2015-3-29 20:01

回复 2# bailong360


    什么浏览器,发一个试试,我看下是怎么回事
作者: bailong360    时间: 2015-3-29 20:06

本帖最后由 bailong360 于 2015-3-29 20:07 编辑

回复 15# CrLf


        解决了,Win8.1 32位 Chrome36下用所见即所得模式发的贴会这样

  1. @Echo OffSetLocal EnableDelayedExpansionFor /L %%i In (1 1 100) Do Echo Test%%iExit
复制代码

PS 这样...
作者: CrLf    时间: 2015-3-29 21:37

回复 16# bailong360


    64位 win7,chrome v36,所见即所得测试结果正常:
  1. @Echo Off
  2. SetLocal EnableDelayedExpansion
  3. For /L %%i In (1 1 100) Do Echo Test%%i
  4. Exit
复制代码

作者: bailong360    时间: 2015-3-29 21:49

回复 17# CrLf


    看来真是我的电脑问题
作者: shootman2    时间: 2015-3-29 23:52

回复 14# pcl_test


setlocal enabledelayedexpansion
for /f "usebackq eol=# tokens=1-14 delims=|" %%a in ("%host_list_file%") do (
        set fileList=
        set fileName=
        set /a filesCnt=0
        for /f "delims=" %%x in ('dir /a /b /s "%deploy_app_folder%\*.zip"') do set fileList=%%x&set fileName=%%~nxx&set /a filesCnt+=1
        if !filesCnt! equ 0 (
                echo 没有应用可以发布
        ) else if !filesCnt! equ 1 (
                echo off>"%deploy_cmd_file%"
                for %%x in ("cd %%g" "put "%%fileList%%" "%%fileName%%"" "exit") do echo %%~x>>"%deploy_cmd_file%"               
                echo psftp %%c -l %%d -pw %%e<"%deploy_cmd_file%"
                echo plink -l %%d -pw %%e %%d@%%c "unzip !fileName!;A"
                echo 主机 %%a.%%b 上的服务 %%f 的应用已经发布
        ) else if !filesCnt! gtr 1 (
                echo 应用程序包有多个,不知道该发布哪个
        )
)
echo 按任意键退出
pause>nul
作者: pcl_test    时间: 2015-3-30 10:03

本帖最后由 pcl_test 于 2015-3-30 10:08 编辑

回复 19# shootman2
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::未见初始化host_list_file、deploy_app_folder、deploy_cmd_file,代码缺失?
  4. for /f "usebackq eol=# tokens=1-14 delims=|" %%a in ("%host_list_file%") do (
  5.         set fileList=
  6.         set fileName=
  7.         set /a filesCnt=0
  8.         for /f "delims=" %%x in ('dir /a /b /s "%deploy_app_folder%\*.zip"') do set fileList=%%x&set fileName=%%~nxx&set /a filesCnt+=1
  9.         if !filesCnt! equ 0 (
  10.                 echo 没有应用可以发布
  11.         ) else if !filesCnt! equ 1 (
  12.                 (
  13.                   echo,cd /d %%g
  14.                   echo,put "!fileList!" "!fileName!"
  15.                   echo,exit
  16.                 )>"%deploy_cmd_file%"
  17.                 echo psftp %%c -l %%d -pw %%e<"%deploy_cmd_file%"
  18.                 echo plink -l %%d -pw %%e %%d@%%c "unzip !fileName!;A"
  19.                 echo 主机 %%a.%%b 上的服务 %%f 的应用已经发布
  20.         ) else if !filesCnt! gtr 1 (
  21.                 echo 应用程序包有多个,不知道该发布哪个
  22.         )
  23. )
  24. echo 按任意键退出
  25. pause>nul
复制代码

作者: shootman2    时间: 2015-3-31 15:20

回复 20# pcl_test


    ok!问题得解!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2