[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
C2R-R2V-AIO.cmd 很长 ,里面 start cmd call
不要去折腾里面的流程
powershell 获取 bat 的 echo 输出
  1. $batout = Invoke-Expression -Command " cmd.exe /c 'C2R-R2V-AIO.cmd' "
复制代码
更简单些

TOP

回复 16# dreamer


   直接call 15楼脚本,遇见什么错误了吗?16楼脚本,打开新窗口后有设置什么不同的变量吗?最后执行的不都goto :eof 之前的 set aa=参数一?
bat小白,请多指教!谢谢!

TOP

回复 9# 77七
試了下還是沒有傳回值,因為該批次要求系統管理員權限進行操作,我使用管理員權限操作,是因為這個因素嗎?

TOP

回复 2# 77七
分析了下,141行的退出似乎只在啟用除錯模式下且條件符合時在141退出,141行前多個條件若有不符時會跳至相應標記
  1. goto :E_WMI
  2. goto :E_WSH
  3. goto :E_VBS
  4. goto :E_PWS
  5. 最後都會到
  6. goto :E_Exit
复制代码
它確實有二個出口,不過能取得%msg%是Finished就足夠了,沒有Finished就是失敗.

TOP

回复 14# dreamer
試了下確實還是可以取得變數內容,1.cmd 呼叫用
  1. call 2.cmd
  2. Echo AAA:%AA%
复制代码
2.cmd的內容是
  1. @echo off
  2. setlocal
  3. %1Call :aaa
  4. endlocal&Set AA=參數一
  5. goto :EOF
  6. :aaa
  7. endlocal&Set AA=參數二
  8. start "" "%SystemRoot%\system32\cmd.exe" /c "%~f0 ::"
复制代码

TOP

回复 14# dreamer


   
无论他执行哪个脚本,只要打开了新窗口,新窗口可以继承原窗口的变量,而不能回传。
可以简单写个脚本验证
  1. @echo off
  2. if "%~1" equ "" (
  3. title 旧
  4. set a=a
  5. start "" "%~f0" xx
  6. ) else (
  7. title 新
  8. set b=b
  9. )
  10. echo %a%
  11. echo %b%
  12. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 12# 77七
33行有定義,它再次呼叫自身,所以應該還是可以取到值.
  1. set "_cmdf=%~f0"
复制代码

TOP

本帖最后由 77七 于 2024-6-9 14:51 编辑

回复 11# dreamer


   可以试着用以下脚本调用
脚本已经修改,刚才逻辑不对
  1. @echo off
  2. if exist "%SystemRoot%\Sysnative\cmd.exe" (
  3. call %SystemRoot%\Sysnative\cmd.exe /c "%~dp0C2R-R2V-AIO.cmd"
  4. ) else (
  5. if exist "%SystemRoot%\SysArm32\cmd.exe" (
  6. if /i %PROCESSOR_ARCHITECTURE%==AMD64 (
  7. call %SystemRoot%\SysArm32\cmd.exe /c "%~dp0C2R-R2V-AIO.cmd"
  8. ) else call "%~dp0C2R-R2V-AIO.cmd"
  9. ) else call "%~dp0C2R-R2V-AIO.cmd"
  10. )
  11. pause
复制代码



删除原脚本第25-43行,注意脚本中的路径,然后按照2楼方法。试试能不能取得msg值。(当然,2楼已经说明,msg存在空值可能)
本人认知、能力有限,可以试一下。
bat小白,请多指教!谢谢!

TOP

回复 11# dreamer


  
  1. start %SystemRoot%\Sysnative\cmd.exe /c ""!_cmdf!" -wow "
复制代码
这行代码作用不是打开一个新窗口?打开的新窗口,call 已经获取不到其变量了吧
bat小白,请多指教!谢谢!

TOP

回复 9# 77七
之前有測試寫入文件確實可行,想說寫入文件那干脆寫入到doskey 裡會不會更好一些.我的作法是在C2R-R2V-AIO 的:E_Exit後加上
  1. If "%msg%" EQU "Finished" Doskey Finished=%msg%
复制代码
然後在用findstr找出符合的字串,因為Finished是唯一條件,找到就成立找不到就失敗,所以用以下內容去判斷
  1. Doskey /macros|findstr /B /E /C:"finished=Finished">Nul&&Echo 完成
复制代码

TOP

回复 8# newswan
又學到一招了!真心感謝,這個方式可以取得C2R-R2V-AIO所有的輸出文字.感覺在這個基礎上,可以將所有需要的函數用Echo輸出而不用考慮setlocal造成的問題,太棒了!

TOP

本帖最后由 77七 于 2024-6-9 13:09 编辑

回复 5# dreamer


  方法1将msg结果重定向到文本
140行左右添加行
  1. @echo off
  2. >>"%~dp0#.txt" echo,%msg%
  3. @exit /b
复制代码


1482行左右添加行
  1. :E_Exit
  2. >>"%~dp0#.txt" echo,%msg%
  3. if %_Debug% EQU 1 goto :eof
  4. echo.
  5. echo Press any key to exit.
复制代码


使用以下脚本调用
  1. @echo off
  2. cd /d "%~dp0"
  3. rem 把两个脚本放在同一目录下。或者自行修改两个脚本的 #.txt 路径
  4. del "%~dp0#.txt" 2>nul
  5. start "" "%~dp0C2R-R2V-AIO.cmd"
  6. :loop
  7. if not exist "%~dp0#.txt" (
  8. timeout 1
  9. goto :loop
  10. )
  11. set _msg=
  12. for /f "useback delims=" %%a in ("%~dp0#.txt") do (
  13. set _msg=%%a
  14. )
  15. if defined _msg (
  16. echo %_msg%
  17. ) else (
  18. echo 原脚本未定义msg
  19. )
  20. del "%~dp0#.txt" 2>nul
  21. pause
复制代码



方法2
可能需要将原脚本 36,41行两个start cmd.exe 及相关部分移植到调用脚本中,这样可以直接 call 调用,有点复杂

我是这样认为的,不知道对不对
bat小白,请多指教!谢谢!

TOP

用 for 获取输出
  1. pushd "%~dp0"
  2. for /f "usebackq tokens=1,* delims= " %%a in (` C2R-R2V-AIO.cmd `) do (
  3. if "%%a" == "msg" (set _msg_=%%b)
  4. )
  5. popd
复制代码
原文件 1481
  1. :E_Exit
  2. echo msg %msg%
复制代码

TOP

回复 4# newswan

感謝回覆,感覺他會是空值,實作也是空值.

TOP

回复 3# aloha20200628
感謝指點,這個是我沒吸收到的,謝謝。

TOP

返回列表