<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      windows/macOS for Batch Script批處理腳本基礎(chǔ)運(yùn)用



      前言

        為了更好的幫助我們理解,我們先來(lái)了解幾個(gè)知識(shí),

      1、什么是批處理腳本?

             批處理腳本(Batch Script)是一種用于在操作系統(tǒng)中自動(dòng)執(zhí)行一系列命令的腳本文件。這種腳本通常用于簡(jiǎn)化重復(fù)性任務(wù),通過(guò)編寫(xiě)一次性的腳本,用戶(hù)可以自動(dòng)化地執(zhí)行多個(gè)命令或程序,而無(wú)需手動(dòng)逐一輸入。批處理腳本的功能非常強(qiáng)大,應(yīng)用場(chǎng)景非常廣泛。語(yǔ)法簡(jiǎn)單,易于學(xué)習(xí)和編寫(xiě)。批處理腳本作為一種強(qiáng)大的自動(dòng)化工具,能夠幫助我們更高效率地完成一些繁瑣、重復(fù)的工作。只要我們善于運(yùn)用它,就能夠在工作和生活中享受到它帶來(lái)的便利和樂(lè)趣。

      2、在Windows和macOS上有什么區(qū)別。
              批處理腳本在不同的操作系統(tǒng)中有不同的實(shí)現(xiàn)。在 Windows 系統(tǒng)中,批處理腳本通常以 .bat 或 .cmd 結(jié)尾,并使用批處理命令(如 cmd 命令)來(lái)執(zhí)行。在 Unix 系統(tǒng)(如 Linux 和 macOS)中他是利用 shell(如 Bash、Zsh、Ksh 等)解釋執(zhí)行一系列命令。兩個(gè)系統(tǒng)的的語(yǔ)法和命令有一些不同。
              如下,一個(gè)簡(jiǎn)單的 Windows 批處理腳本是這樣的:這個(gè)腳本使用了 Windows 特有的批處理命令,如 @echo off、echo、dir 和 pause,

      @echo off
      echo Hello, World!
      dir
      pause


       


      一:創(chuàng)建一個(gè)簡(jiǎn)單的批處理腳本

       

          1、在macOS系統(tǒng)蘋(píng)果電腦上創(chuàng)建shell批處理腳本步驟。

       

      1.1、先進(jìn)入啟動(dòng)臺(tái),在啟動(dòng)臺(tái)中選擇“其他”菜單,

      1.2、然后再選擇文本編輯器。

      1.3、然后再電腦左上角文本編輯器的菜單欄目中,按照右側(cè)兩張圖選擇文本格式。西文(ASCII)

       1.4、然后重啟文件編輯器,
      1.5、點(diǎn)擊顯示選項(xiàng),確保需要的文本編碼正確。西文(ASCII)
      1.6、點(diǎn)擊,新建文稿

      1.7、在文本編輯器中,鍵入腳本代碼
      1.8、保存,注意文件名稱(chēng),后綴名需要是.sh,且一定要檢查編碼格式。PS:如果你保存的內(nèi)容中無(wú)法選這個(gè)西文(ASCII),那就隨意選擇一個(gè),后綴名是要是.sh,也是可以執(zhí)行的。
      1.9、使用訪達(dá),在自己的保存路徑中,找到保存的腳本文件

       

       1.10、打開(kāi)終端,然后進(jìn)入保存的文件夾里,
      (可以直接拖放文件到終端)
      1.11、輸入chmod +x name.sh 為文件賦予權(quán)限
      1.12、輸入./name.sh 運(yùn)行文件

       代碼和命令如下:

      #!/bin/bash
      echo "Hello, World!"
      a1234@Zh Documents % pwd
      /Users/a1234/Documents  #需要先進(jìn)入腳本所在文件夾
      a1234@Zh Documents % chmod +x hello.sh   # 確保腳本有執(zhí)行權(quán)限            
      a1234@Zh Documents % ./hello.sh   #運(yùn)行腳本的命令
      Hello, World!   #最終輸出
      

       

       

         2、在Windows電腦上創(chuàng)建批處理腳本步驟。

      第一步:最好是用notpad++來(lái)寫(xiě),在notpad++中輸入以下內(nèi)容:

      @echo off
      echo Hello, World!
      pause

      第二步:工具欄中編碼選擇:轉(zhuǎn)為ANSI編碼,并保存,后綴名需要是.bat 或者.cmd,保存到桌面

      第三步:在桌面直接雙擊執(zhí)行,上一步的.bat文件。以下是執(zhí)行效果

       到這兒,我們已經(jīng)初步接觸批處理文件。接下來(lái)就要開(kāi)始正式的使用批處理文件,來(lái)執(zhí)行一些業(yè)務(wù)了。

       

       

       

      二:正式寫(xiě)一個(gè)批處理腳本,通過(guò)adb命令對(duì)安卓設(shè)備進(jìn)行應(yīng)用操作

       


            在調(diào)試之前,建議開(kāi)發(fā)者設(shè)置里邊,先開(kāi)啟2個(gè)小功能,1、打開(kāi)"指針位置" 2、打開(kāi)USB調(diào)試且允許僅充電模式調(diào)試、前者,開(kāi)啟后,就可以看到手指點(diǎn)按屏幕的xy軸坐標(biāo)位置,有助于我們定位屏幕坐標(biāo)。后者是有助于調(diào)試的便捷。

            

       1、咱們先直接把完整(.bat)腳本貼出來(lái),然后再逐步驟去解析,這樣也方便,有相關(guān)代碼功底的小伙伴直接取用。macOS電腦shell腳本放在末尾。

       

      @echo off
      
      :: 查詢(xún)?cè)O(shè)備狀態(tài)
      for /f "delims=" %%i in ('adb get-state') do set DEVICE_STATE=%%i
      
      :: 判斷設(shè)備狀態(tài)
      if "%DEVICE_STATE%"=="unknown" (
          echo.
          echo.
          echo 請(qǐng)連接設(shè)備后,再重新執(zhí)行本程序
          echo.
          echo.
          pause
          exit /b 1
      ) else (
          echo.
          echo.
          echo 設(shè)備已就緒,請(qǐng)勿手動(dòng)操作屏幕...
      )
      
      :: 解鎖密碼的坐標(biāo),若密碼是不同的數(shù)字,則在下面添加不同的點(diǎn)擊語(yǔ)句,這里注釋即可。
      set X_COORD=1290
      set Y_COORD=1447
      
      setlocal
      
      :: 獲取屏幕顯示狀態(tài)
      for /f "tokens=2 delims==" %%i in ('adb shell dumpsys window policy ^| findstr "screenState="') do set "screenState=%%~i"
      :: 去除狀態(tài)值兩邊的空格
      set "screenState=%screenState: =%"
      
      :: 判斷屏幕狀態(tài)并執(zhí)行操作
      if /i "%screenState%"=="SCREEN_STATE_OFF" (
          ::screenState=SCREEN_STATE_OFF,設(shè)備為息屏狀態(tài),直接點(diǎn)亮屏幕解鎖即可
          echo.
          echo.
          echo 正在喚醒設(shè)備...
          adb shell input keyevent KEYCODE_POWER
          timeout /t 2 /nobreak >nul
      
          echo.
          echo.
          ::打開(kāi)解鎖界面...
          adb shell input swipe 700 700 100 100 500
          timeout /t 2 /nobreak >nul
      
          ::解鎖設(shè)備...
          for /L %%i in (1,1,6) do (
              adb shell input tap %X_COORD% %Y_COORD%
          )
          timeout /t 2 /nobreak >nul
      
      ) else if /i "%screenState%"=="SCREEN_STATE_ON" (
          ::screenState=SCREEN_STATE_ON,設(shè)備為亮屏狀態(tài),需要判斷設(shè)備是否上鎖
          echo.
          echo.
      
      
          :: 獲取設(shè)備鎖定狀態(tài)
          for /f "tokens=2 delims==" %%i in ('adb shell dumpsys window policy ^| findstr "showing="') do (
              set "showing=%%~i"
              :: 立即處理變量,避免后續(xù)可能的覆蓋
              setlocal enabledelayedexpansion
              if /i "!showing: =!"=="true" (
                  ::showing=true,設(shè)備為鎖屏狀態(tài),直接解鎖即可,若為false,已解鎖,可以直接開(kāi)始執(zhí)行業(yè)務(wù)代碼
                  echo.
                  echo.
                  ::打開(kāi)解鎖界面
                  adb shell input swipe 700 700 100 100 500
                  timeout /t 2 /nobreak >nul
      
                  echo.
                  ::解鎖設(shè)備...
                  for /L %%j in (1,1,6) do (
                      adb shell input tap %X_COORD% %Y_COORD%
                  )
                  timeout /t 2 /nobreak >nul
              )
              endlocal
          )
      )
      
      endlocal
      
      
      
      
          echo.
          echo.
          echo 啟動(dòng)應(yīng)用...
          
          :: 殺掉應(yīng)用
          adb shell am force-stop com.xxx.xxx
          :: 等待設(shè)備響應(yīng)(固定等待2秒)
          timeout /t 2 /nobreak >nul
          
          
          :: 使用monkey啟動(dòng)應(yīng)用主界面
          adb shell monkey -p com.xxx.xxx -c android.intent.category.LAUNCHER 1 >nul
          :: 等待設(shè)備響應(yīng)(固定等待2秒)
          timeout /t 2 /nobreak >nul
          
      
      :: 點(diǎn)擊要的功能按鈕
          adb shell input tap 2139 1242
      
      :: 畫(huà)一個(gè)正方形
          adb shell input swipe  1089 1160 1089 930 500
          adb shell input swipe  1089 930 1466 930 500
          adb shell input swipe  1467 930 1466 1160 500
          adb shell input swipe  1466 1160 1091 1160 500
          
          :: 等待設(shè)備響應(yīng)(固定等待2秒)
          timeout /t 2 /nobreak >nul
          
      setlocal
      set "DESKTOP_PATH=%USERPROFILE%\Desktop\test_photo"
      
      :: 獲取當(dāng)前時(shí)間戳
      for /f "delims=" %%i in ('powershell -command "[System.DateTime]::Now.ToString(\"yyyyMMdd_HHmmss\")"') do set TIMESTAMP=%%i
      
      :: 在設(shè)備上截圖,使用臨時(shí)文件名
      adb shell screencap -p /sdcard/Pictures/Screenshots/temp_AICreate.jpg
      
      :: 重命名截圖文件,包含時(shí)間戳
      adb shell "mv /sdcard/Pictures/Screenshots/temp_AICreate.jpg /sdcard/Pictures/Screenshots/AICreate_%TIMESTAMP%.jpg"
      
      :: 檢查目標(biāo)文件夾是否存在,如果不存在則創(chuàng)建
      set "TARGET_FOLDER=%DESKTOP_PATH%"
      if not exist "%TARGET_FOLDER%" (
      mkdir "%TARGET_FOLDER%"
      )
      
      :: 保存截圖文件,到電腦
      adb pull /sdcard/Pictures/Screenshots/AICreate_%TIMESTAMP%.jpg "%TARGET_FOLDER%\AICreate_%TIMESTAMP%.jpg" >nul 2>nul
      
      :: 在設(shè)備上刪除截圖文件
      adb shell "rm /sdcard/Pictures/Screenshots/AICreate_%TIMESTAMP%.jpg"
      
      :: 清理環(huán)境變量
      endlocal
      
      
      
      
      
          :: 開(kāi)始AI生圖
          echo.
          echo.
          echo AI生圖中...
      
          adb shell input tap 1300 1152
          :: 等待設(shè)備響應(yīng)(固定等待30秒)
          timeout /t 30 /nobreak >nul
          
          echo.
          echo.
          echo 正在保存結(jié)果...
      
          :: 點(diǎn)擊保存按鈕
          adb shell input tap 1540 1350
          :: 等待設(shè)備響應(yīng)(固定等待2秒)
          timeout /t 2 /nobreak >nul
          
      
       :: 休眠設(shè)備(電源鍵) 
      echo 正在使設(shè)備進(jìn)入休眠狀態(tài)... 
      adb shell input keyevent KEYCODE_SLEEP   
      
          
          :: 批處理文件執(zhí)行完畢
          echo.
          echo.
          echo 所有操作已完成!正在為您打印設(shè)備信息...
          echo.
          echo.
      
      :: 輸出設(shè)備以及應(yīng)用信息
      setlocal enabledelayedexpansion
      
      :: 定義變量來(lái)存儲(chǔ)命令輸出
      set "brand="
      set "model="
      set "screen_resolution="
      set "android_version="
      set "app_version="
      set "current_time="
      
      :: 執(zhí)行命令并捕獲輸出
      for /f "delims=" %%i in ('adb shell getprop ro.config.marketing_name') do set "brand=%%i"
      for /f "delims=" %%i in ('adb shell getprop ro.product.model') do set "model=%%i"
      for /f "tokens=2 delims=:" %%i in ('adb shell wm size ^| findstr "Physical size"') do set "screen_resolution=%%i"
      for /f "delims=" %%i in ('adb shell getprop ro.build.version.release') do set "android_version=%%i"
      for /f "tokens=2 delims== " %%i in ('adb shell dumpsys package com.XXX.XXX ^| findstr "versionName"') do set "app_version=%%i"
      for /f "delims=" %%i in ('powershell "Get-Date -Format 'yyyy-MM-dd HH:mm:ss'" ') do set "current_time=%%i"
      
      :: 拼接品牌和型號(hào)
      set "device_name=!brand! !model!"
      
      :: 輸出結(jié)果
      echo 設(shè)備型號(hào):!device_name!
      echo 安卓版本:!android_version!
      echo 屏分辨率:!screen_resolution!
      echo 應(yīng)用版本:!app_version!
      echo 當(dāng)前時(shí)間:!current_time!
      echo.
      echo.
      endlocal
      pause

       

       

       2、現(xiàn)在我們將以上代碼,按照大致的功能模塊,分為6個(gè)部分。來(lái)逐段、逐句解析代碼。

       

       第一部份:

             先看看開(kāi)頭第一句是怎么寫(xiě)的。

      @echo off
           ::  在批處理腳本的開(kāi)頭使用@echo off 命令,是用于關(guān)閉命令的回顯功能。這意味著,在執(zhí)行該命令之后的腳本內(nèi)容時(shí),命令本身不會(huì)在打印輸出,只有命令的結(jié)果會(huì)被輸出顯示。
           ::  echo 是一個(gè)用于在命令行界面顯示信息的命令。
           ::  off 是 echo 命令的一個(gè)參數(shù),用于關(guān)閉回顯。
           ::  @ 符號(hào)用于確保即使全局回顯被打開(kāi)(例如,在腳本的開(kāi)頭沒(méi)有使用 @echo off),該行的命令也不會(huì)被顯示。

       

       

       第二部份:

              接下來(lái)這段批處理腳本,先通過(guò)adb命令:adb get-state來(lái)查詢(xún)?cè)O(shè)備連接狀態(tài),如果查出來(lái)的結(jié)果是unknown,就代表沒(méi)有連接設(shè)備,這時(shí)候輸出一句:請(qǐng)連接設(shè)備后,再重新執(zhí)行本程序。用來(lái)提醒用戶(hù)需要先鏈接設(shè)備。且通過(guò) exit /b 1這段命令,終結(jié)腳本的執(zhí)行,exit /b 1 在批處理腳本中的意義是:不關(guān)閉命令提示符窗口,立即退出當(dāng)前批處理腳本或命令行塊的執(zhí)行語(yǔ)句,就是說(shuō)下面的命令都不再去執(zhí)行啦。如果不是unknown,那么就說(shuō)明已經(jīng)鏈接上設(shè)備,就不需要做任何操作。直接輸出了一句:“設(shè)備已就緒,請(qǐng)勿手動(dòng)操作屏幕...”,然后繼續(xù)執(zhí)行后續(xù)代碼。

      for /if "delims=" %%i in ('adb get-state') do set DEVICE_STATE=%%i
             ::  for /f "delims=" %%i in ('adb get-state') do set DEVICE_STATE=%%i 是一個(gè) for 循環(huán),用于執(zhí)行 adb get-state 命令并捕獲其輸出。
             ::  "delims=" 指定分隔符為空,這意味著整行輸出都會(huì)被捕獲為一個(gè)單獨(dú)的變量值。
             ::  %%i 是循環(huán)變量,用于存儲(chǔ)每一行的內(nèi)容(在這個(gè)場(chǎng)景中,由于 adb get-state 只輸出一行,所以 %%i 將包含整行輸出)。
             ::  'adb get-state' 是被執(zhí)行的命令,用于查詢(xún)ADB連接的設(shè)備狀態(tài)。
             ::  do set DEVICE_STATE=%%i 表示將循環(huán)變量的值(即 adb get-state 的輸出)賦值給環(huán)境變量 DEVICE_STATE。
             
             
      :: 判斷設(shè)備狀態(tài)
             :: 是批處理腳本中的注釋符號(hào),REM 也是注釋符號(hào)。
      if "%DEVICE_STATE%"=="unknown" (
             ::  if "%DEVICE_STATE%"=="unknown" 是一個(gè)條件判斷語(yǔ)句,用于檢查環(huán)境變量 DEVICE_STATE 的值是否等于 "unknown"。
             ::  如果等于 "unknown",則執(zhí)行 if 括號(hào)內(nèi)的命令。如果不等于 "unknown",則執(zhí)行 else 括號(hào)內(nèi)的命令。
          echo.
          echo.
          echo 請(qǐng)連接設(shè)備后,再重新執(zhí)行本程序
          echo.
          echo.
             ::  echo.  用于輸出一個(gè)空行,增加可讀性。
             ::  pause 命令用于暫停腳本執(zhí)行,并顯示“Press any key to continue...”消息,等待用戶(hù)按下任意鍵。
          pause
          exit /b 1
      ) else (
          echo.
          echo.
          echo 設(shè)備已就緒,請(qǐng)勿手動(dòng)操作屏幕...
      )

       

       

       

       第三部份:

      這段批處理腳本主要用于通過(guò)ADB命令控制Android設(shè)備,包括喚醒設(shè)備、判斷屏幕狀態(tài)、以及解鎖設(shè)備。

      這個(gè)實(shí)現(xiàn)邏輯,比上面的判斷是否鏈接設(shè)備,要多一個(gè)子嵌套。我們來(lái)看看。

      首先,adb shell dumpsys window policy ^| findstr "screenState="這個(gè)命令查是查詢(xún)?cè)O(shè)備是否點(diǎn)亮屏幕的。查出來(lái)會(huì)有兩個(gè)結(jié)果。

          如果,screenState=SCREEN_STATE_OFF,則說(shuō)明設(shè)備為息屏狀態(tài),直接點(diǎn)亮屏幕解鎖即可。(即,第一個(gè)if語(yǔ)句里邊的,就是解鎖的命令)
          如果,screenState=SCREEN_STATE_ON,則說(shuō)明設(shè)備為亮屏狀態(tài),那就需要判斷,設(shè)備是否上鎖,(即,第二個(gè)else if語(yǔ)句里邊的,就是查設(shè)備是否上鎖的命令以及后續(xù)操作)

      然后,adb shell dumpsys window policy ^| findstr "showing=" 這個(gè)命令查就是查詢(xún)?cè)O(shè)備是否上鎖的。查出來(lái)同樣會(huì)有兩個(gè)結(jié)果。
         如果,showing=true,則說(shuō)明設(shè)備為屏幕點(diǎn)亮的且是鎖屏狀態(tài),這個(gè)時(shí)候直接解鎖即可。
         如果,showing不是true,則說(shuō)明設(shè)備為屏幕點(diǎn)亮的且是解鎖屏狀態(tài),那就不需要執(zhí)行多余的步驟,可以直接開(kāi)始接下來(lái)的業(yè)務(wù)操作了。

      set X_COORD=1290
      set Y_COORD=1447
      
              ::這兩行設(shè)置了解鎖密碼在屏幕上的X和Y坐標(biāo)。我這兒是定位到了解鎖鍵盤(pán)的0,因?yàn)槲业脑O(shè)備密碼是6個(gè)0。后續(xù)我通過(guò)adb命令,循環(huán)點(diǎn)擊這個(gè)坐標(biāo)6次,即可實(shí)現(xiàn)解鎖,所以如果你的設(shè)備密碼是不同的數(shù)字,那么這里就不適用,需要在下面的點(diǎn)擊密碼語(yǔ)句中,每個(gè)數(shù)字寫(xiě)一句。
      
      setlocal
              ::setlocal這行開(kāi)啟了批處理腳本的本地環(huán)境變量作用域,意味著之后定義的變量在腳本結(jié)束時(shí)會(huì)自動(dòng)銷(xiāo)毀,不會(huì)影響到全局環(huán)境。文末的endlocal,這行結(jié)束了本地環(huán)境變量作用域,與腳本開(kāi)始時(shí)的setlocal相對(duì)應(yīng)。
      
      :: 獲取屏幕顯示狀態(tài)
      for /f "tokens=2 delims==" %%i in ('adb shell dumpsys window policy ^| findstr "screenState="') do set "screenState=%%~i"
      :: 去除狀態(tài)值兩邊的空格
      set "screenState=%screenState: =%"
      
      :: 判斷屏幕狀態(tài)并執(zhí)行操作
      if /i "%screenState%"=="SCREEN_STATE_OFF" (
          ::screenState=SCREEN_STATE_OFF,設(shè)備為息屏狀態(tài),直接點(diǎn)亮屏幕解鎖即可
          echo.
          echo.
          echo 正在喚醒設(shè)備...
          adb shell input keyevent KEYCODE_POWER
               ::用adb命令點(diǎn)擊電源按鍵,點(diǎn)亮設(shè)備屏幕
               ::input:這是Android shell中的一個(gè)命令,用于向設(shè)備發(fā)送輸入事件,如按鍵、觸摸等。
               ::keyevent:這是input命令的一個(gè)參數(shù),表示要發(fā)送的是一個(gè)按鍵事件。
               ::KEYCODE_POWER:這是keyevent命令的一個(gè)參數(shù),表示要模擬的按鍵是電源鍵。
               
          timeout /t 2 /nobreak >nul
      
               ::timeout /t 2 /nobreak >nul 這條CMD命令的作用是:創(chuàng)建一個(gè)2秒的等待延遲,期間忽略任何中斷嘗試,并且不顯示任何輸出:
               ::timeout:這是Windows命令行中用于創(chuàng)建暫停或延遲執(zhí)行的命令。它允許你指定一個(gè)時(shí)間段,在此期間命令行將不做任何事情,然后繼續(xù)執(zhí)行后續(xù)的命令。
               ::/t 2:這個(gè)參數(shù)指定了延遲的時(shí)間長(zhǎng)度。在這個(gè)例子中,/t 后面跟著的數(shù)字 2 表示延遲時(shí)間為2秒。
               ::/nobreak:這個(gè)參數(shù)指示 timeout 命令忽略任何中斷延遲的嘗試。通常,你可以通過(guò)按鍵(如Ctrl+C)來(lái)中斷 timeout 命令的執(zhí)行,但使用 /nobreak 參數(shù)后,這種中斷將被忽略,延遲將完整地執(zhí)行。
               ::>nul:這部分是輸出重定向。在Windows命令行中,> 用于將命令的輸出重定向到指定的文件或設(shè)備。nul 是一個(gè)特殊的設(shè)備,它接收任何發(fā)送到它的數(shù)據(jù),但并不做任何處理(即,它是一個(gè)黑洞,吞噬所有數(shù)據(jù))。因此,>nul 的作用是將 timeout 命令的任何輸出(如倒計(jì)時(shí)信息)都重定向到 nul,從而不在命令行窗口中顯示這些輸出。
               
          echo.
          echo.
          ::打開(kāi)解鎖界面...
          adb shell input swipe 700 700 100 100 500
               ::這條ADB命令 adb shell input swipe 700 700 100 100 500 用于在Android設(shè)備上模擬一個(gè)滑動(dòng)操作:
               ::input:這是shell環(huán)境中用于發(fā)送輸入事件到Android設(shè)備的命令。它可以模擬按鍵、觸摸等用戶(hù)輸入。
               ::swipe:這是input命令的一個(gè)子命令,用于模擬一個(gè)滑動(dòng)(拖拽)操作。
               ::700 700:這兩個(gè)數(shù)字指定了滑動(dòng)操作的起始坐標(biāo)(X軸和Y軸)。在這個(gè)例子中,滑動(dòng)將從屏幕上的點(diǎn)(700, 700)開(kāi)始。
               ::100 100:這兩個(gè)數(shù)字指定了結(jié)束坐標(biāo)(X軸和Y軸)
               ::500:這個(gè)數(shù)字通常指定了滑動(dòng)操作的持續(xù)時(shí)間(以毫秒為單位)。在這個(gè)例子中,滑動(dòng)操作將在500毫秒內(nèi)完成。
          timeout /t 2 /nobreak >nul
      
          ::解鎖設(shè)備...
          for /L %%i in (1,1,6) do (
              adb shell input tap %X_COORD% %Y_COORD%
               ::前面有定義X_COORD和Y_COORD的值,這里的命令代表,循環(huán)點(diǎn)擊6次目標(biāo)的坐標(biāo),模擬點(diǎn)擊6次鎖屏密碼。
          )
               ::這條命令結(jié)合了for循環(huán)和adb shell input tap命令來(lái)在Android設(shè)備上模擬重復(fù)點(diǎn)擊操作。不過(guò),需要注意的是,adb shell input tap命令每次循環(huán)都使用了相同的坐標(biāo)(%X_COORD% 和 %Y_COORD%),因此它實(shí)際上只是在同一個(gè)位置重復(fù)點(diǎn)擊。所以如果你的鎖屏密碼是不同的數(shù)字,需要把循環(huán)體刪除,直接單獨(dú)寫(xiě)adb的點(diǎn)擊命令:
               ::
               ::for /L %%i in (1,1,6) do(:這是一個(gè)for循環(huán)的開(kāi)始,用于在Windows批處理腳本中重復(fù)執(zhí)行一系列命令。/L表示這是一個(gè)計(jì)數(shù)循環(huán)。循環(huán)變量%%i將從1開(kāi)始,每次循環(huán)增加1,直到達(dá)到6(包含6)。因此,這個(gè)循環(huán)將執(zhí)行6次。
               ::adb shell input tap %X_COORD% %Y_COORD%:這個(gè)ADB命令,用于在Android設(shè)備的屏幕上模擬一個(gè)點(diǎn)擊操作。
               
          timeout /t 2 /nobreak >nul
      
      ) else if /i "%screenState%"=="SCREEN_STATE_ON" (
          ::screenState=SCREEN_STATE_ON,設(shè)備為亮屏狀態(tài),需要判斷設(shè)備是否上鎖
          echo.
          echo.
      
      
          :: 獲取設(shè)備鎖定狀態(tài)
          for /f "tokens=2 delims==" %%i in ('adb shell dumpsys window policy ^| findstr "showing="') do (
              set "showing=%%~i"
              :: 立即處理變量,避免后續(xù)可能的覆蓋
              setlocal enabledelayedexpansion
              if /i "!showing: =!"=="true" (
                  ::showing=true,設(shè)備為鎖屏狀態(tài),直接解鎖即可,若為false,已解鎖,可以直接開(kāi)始執(zhí)行業(yè)務(wù)代碼
                  echo.
                  echo.
                  ::打開(kāi)解鎖界面
                  adb shell input swipe 700 700 100 100 500
                  timeout /t 2 /nobreak >nul
      
                  echo.
                  ::解鎖設(shè)備...
                  for /L %%j in (1,1,6) do (
                      adb shell input tap %X_COORD% %Y_COORD%
                  )
                  timeout /t 2 /nobreak >nul
              )
              endlocal
          )
      )
      
      endlocal



      第四部
      此前的代碼,主要是為了解鎖設(shè)備,設(shè)備準(zhǔn)備好,現(xiàn)在我們要開(kāi)始執(zhí)行業(yè)務(wù)操作了,如下的一段代碼中,重要的知識(shí)點(diǎn),有2個(gè):
      1、使用adb命令,殺應(yīng)用。
      2、使用monkey打開(kāi)應(yīng)用的首頁(yè)。
      3、除此以外在應(yīng)用程序的操作中,以下代碼中僅使用了input tap點(diǎn)擊命令,和input swipe滑動(dòng)屏幕命令。還有更多種操作方式和場(chǎng)景等待你的發(fā)掘。
          echo.
          echo.
          echo 啟動(dòng)應(yīng)用...
          
          :: 殺掉應(yīng)用
          adb shell am force-stop com.xxx.xxx
              ::這條ADB命令,用于強(qiáng)制停止Android設(shè)備上的一個(gè)應(yīng)用程序。我先殺掉目標(biāo)程序,然后再后面重新啟用:
              ::am:這是Activity Manager的縮寫(xiě),是Android系統(tǒng)中的一個(gè)服務(wù),負(fù)責(zé)管理應(yīng)用程序的活動(dòng)(Activity)、服務(wù)(Service)、廣播接收器(Broadcast Receiver)等內(nèi)容。通過(guò)am命令,可以啟動(dòng)活動(dòng)、發(fā)送廣播、強(qiáng)制停止應(yīng)用程序等。
              ::force-stop:這是am命令的一個(gè)子命令,用于強(qiáng)制停止指定的應(yīng)用程序。與普通的停止命令不同,force-stop會(huì)立即停止應(yīng)用程序的所有活動(dòng)和服務(wù),而不考慮應(yīng)用程序是否正在處理重要的任務(wù)。
              ::com.xxx.xxx:這是要被強(qiáng)制停止的應(yīng)用程序的包名。可以通過(guò)查看包名的命令去獲取并替換為自己應(yīng)用的包名。查看包名命令:adb shell pm list packages。
      
          :: 等待設(shè)備響應(yīng)(固定等待2秒)
          timeout /t 2 /nobreak >nul
          
          
          :: 使用monkey啟動(dòng)應(yīng)用主界面
          adb shell monkey -p com.xxx.xxx -c android.intent.category.LAUNCHER 1 >nul
              ::monkey:這是Android SDK中的一個(gè)工具,用于生成偽隨機(jī)的用戶(hù)輸入事件。用于向系統(tǒng)發(fā)送偽隨機(jī)的用戶(hù)輸入事件流(如點(diǎn)擊、觸摸、手勢(shì)和系統(tǒng)事件),模擬用戶(hù)操作設(shè)備的行為。
              ::-p com.xxx.xxx:-p 指定了monkey命令要發(fā)送事件的目標(biāo)應(yīng)用程序的包名。
              ::-c android.intent.category.LAUNCHER: 這個(gè)是啟動(dòng)應(yīng)用的首頁(yè)。
              ::1:這個(gè)數(shù)字通常表示要發(fā)送的事件數(shù)量。它表示只發(fā)送一個(gè)事件。
              ::>nul:這個(gè)部分是將命令的輸出重定向到nul,即無(wú)需輸出結(jié)果。
              
          :: 等待設(shè)備響應(yīng)(固定等待2秒)
          timeout /t 2 /nobreak >nul
          
      
      :: 點(diǎn)擊要的功能按鈕
          adb shell input tap 2139 1242
      
      :: 畫(huà)一個(gè)正方形
          adb shell input swipe  1089 1160 1089 930 500
          adb shell input swipe  1089 930 1466 930 500
          adb shell input swipe  1467 930 1466 1160 500
          adb shell input swipe  1466 1160 1091 1160 500
          
          :: 等待設(shè)備響應(yīng)(固定等待2秒)
          timeout /t 2 /nobreak >nul

       

      第五部份:

      接下來(lái)是一段,對(duì)設(shè)備的截圖,并保存截圖到本地電腦上的命令。其中的知識(shí)點(diǎn)有幾個(gè)需要注意的:
      1、%USERPROFILE% 這個(gè)變量會(huì)生成文件夾路徑的用戶(hù)路徑,如:C:\Users\Hanmeimei
      2、時(shí)間戳的定義和調(diào)用方式
      3、if not exist (XXX)mkdir 判斷目標(biāo),不存在即新建。
      4、screencap截圖命令
      5、rm刪除文件命令
      6、mv重命名或移動(dòng)文件的命令,
      7、pull,下載的命令。
      @echo off
      setlocal
      
      set "DESKTOP_PATH=%USERPROFILE%\Desktop\test_photo"
             :: 定義桌面文件夾路徑,
             :: 使用 %USERPROFILE% 來(lái)替換 C:\Users\Hanmeimei,從而構(gòu)建一個(gè)更加通用的文件路徑。
             :: \Desktop\test_photo 這個(gè)是桌面的文件夾路徑。最終的文件夾名字,根據(jù)自己需要的去修改。
             :: 把整個(gè)文件夾的路徑,賦值給變量DESKTOP_PATH
      
      
      :: 獲取當(dāng)前時(shí)間戳
      for /f "delims=" %%i in ('powershell -command "[System.DateTime]::Now.ToString(\"yyyyMMdd_HHmmss\")"') do set TIMESTAMP=%%i
      
             :: 這段命令是用于生成當(dāng)前日期和時(shí)間的字符串,并將其賦值給一個(gè)名為 TIMESTAMP 的環(huán)境變量,后續(xù)部分可以直接使用這個(gè)變量來(lái)引用當(dāng)前的日期和時(shí)間了:
             :: for /f:這是 for 命令的一種形式,用于對(duì)文件內(nèi)容或命令的輸出進(jìn)行迭代處理。在這里,它用于處理 PowerShell 命令的輸出。
             :: "delims=":這個(gè)選項(xiàng)指定了分隔符。由于這里設(shè)置為空字符串,實(shí)際上意味著不使用任何分隔符。
             :: %%i:在批處理腳本中,%%i 是循環(huán)變量。
             :: in ('powershell -command "[System.DateTime]::Now.ToString(\"yyyyMMdd_HHmmss\")"'):這部分是 for 命令要迭代的命令。它執(zhí)行一個(gè) PowerShell 命令,該命令使用 .NET Framework 的 System.DateTime 類(lèi)來(lái)獲取當(dāng)前日期和時(shí)間,并將其格式化為 yyyyMMdd_HHmmss 格式的字符串。
             :: do set TIMESTAMP=%%i:這將 PowerShell 命令的輸出(即當(dāng)前日期和時(shí)間的字符串)賦值給 TIMESTAMP 環(huán)境變量。
      
      
      
      :: 在設(shè)備上截圖,使用臨時(shí)文件名
      adb shell screencap -p /sdcard/Pictures/Screenshots/temp_AICreate.jpg
             ::這段命令是用于在 Android 設(shè)備上通過(guò) ADB工具截取屏幕截圖,并將截圖保存到設(shè)備的指定位置。:
             ::screencap:這是 Android 設(shè)備上的一個(gè)命令,用于捕獲當(dāng)前屏幕的截圖。這個(gè)命令是 Android 系統(tǒng)的一部分,通常位于設(shè)備的 /system/bin 目錄下。
             ::-p:這是 screencap 命令的一個(gè)選項(xiàng),表示以 PNG 格式保存截圖。使用-p參數(shù)時(shí),screencap命令會(huì)確保截圖以PNG格式保存。PNG是一種無(wú)損壓縮的位圖圖像格式,能夠保留圖像中的透明度和色彩深度,非常適合用于保存屏幕截圖。
      
      
      :: 重命名截圖文件,包含時(shí)間戳
      adb shell "mv /sdcard/Pictures/Screenshots/temp_AICreate.jpg /sdcard/Pictures/Screenshots/AICreate_%TIMESTAMP%.jpg"
             ::mv:這是 Unix/Linux 系統(tǒng)中的一個(gè)命令,這條adb命令使用了mv(move)命令,用于移動(dòng)或重命名文件或目錄,這里實(shí)際上是重命名為一個(gè)帶有時(shí)間戳的文件名。
             ::/sdcard/Pictures/Screenshots/temp_AICreate.jpg:這是要重命名的原始文件的路徑和文件名。
             ::/sdcard/Pictures/Screenshots/AICreate_%TIMESTAMP%.jpg:這是重命名后的文件的路徑和文件名。這里的 %TIMESTAMP% ,上文中將這個(gè)變量定義為了一個(gè)時(shí)間戳。所以最終生成的文件名是這樣的:AICreate_20241223_094030.jpg
      
      
      :: 檢查目標(biāo)文件夾是否存在,如果不存在則創(chuàng)建
      set "TARGET_FOLDER=%DESKTOP_PATH%"
      if not exist "%TARGET_FOLDER%" (
          mkdir "%TARGET_FOLDER%"
      )
             :: "TARGET_FOLDER=%DESKTOP_PATH%",這里的“DESKTOP_PATH”的值在本段代碼開(kāi)頭定義為:C:\Users\Hanmeimei\Desktop\test_photo
             :: 所以,if not exist "%TARGET_FOLDER%" (mkdir "%TARGET_FOLDER%")這段的意思是,如果不存在test_photo這個(gè)文件夾,則通過(guò)mkdir創(chuàng)建一個(gè)。
      
      :: 保存截圖文件,到電腦
      adb pull /sdcard/Pictures/Screenshots/AICreate_%TIMESTAMP%.jpg "%TARGET_FOLDER%\AICreate_%TIMESTAMP%.jpg" >nul 2>nul
             ::adb pull:這是 adb 工具的一個(gè)命令,用于從 Android 設(shè)備上復(fù)制文件或目錄到本地計(jì)算機(jī)。
             ::>nul 2>nul:這部分是 Windows 命令提示符(cmd)的語(yǔ)法,用于處理命令的輸出和錯(cuò)誤信息。>nul 將標(biāo)準(zhǔn)輸出重定向到 nul,這基本上意味著丟棄所有正常輸出。2>nul 將標(biāo)準(zhǔn)錯(cuò)誤輸出也重定向到 nul,這意味著所有錯(cuò)誤信息也會(huì)被丟棄。簡(jiǎn)單說(shuō)就是任何信息都不要輸出。大家有時(shí)間可以去嘗試一下分別把兩個(gè)取消后是什么樣子。
      
      :: 在設(shè)備上刪除截圖文件
      adb shell "rm /sdcard/Pictures/Screenshots/AICreate_%TIMESTAMP%.jpg"
             ::rm 命令是用于刪除文件或目錄的命令行工具。 "remove" 的縮寫(xiě)。這里是把截圖文件從移動(dòng)設(shè)備中刪除,用以保持設(shè)備沒(méi)有運(yùn)行腳本后產(chǎn)生的垃圾文件。
      
      :: 清理環(huán)境變量
      endlocal
      
      echo Done!
      
      pause

       

       第六部分:

      最后一段,用來(lái)輸出設(shè)備信息、應(yīng)用信息等,需要什么信息都可以自己去添加。

       

      
      :: 輸出設(shè)備以及應(yīng)用信息
      setlocal enabledelayedexpansion
             :: 這行命令啟用了延遲變量擴(kuò)展。這意味著在執(zhí)行循環(huán)或條件語(yǔ)句時(shí),可以正確地使用變量。
      
      :: 定義變量來(lái)存儲(chǔ)命令輸出
      set "brand="
      set "model="
      set "screen_resolution="
      set "android_version="
      set "app_version="
      set "current_time="
             :: 這些行定義了幾個(gè)變量,用于存儲(chǔ)后面通過(guò)命令獲取的設(shè)備信息、應(yīng)用版本和當(dāng)前時(shí)間。
      
      :: 執(zhí)行命令并捕獲輸出
      for /f "delims=" %%i in ('adb shell getprop ro.config.marketing_name') do set "brand=%%i"
             :: 這行命令使用 adb 工具獲取設(shè)備的品牌信息,并將其存儲(chǔ)在變量 brand 中。
      for /f "delims=" %%i in ('adb shell getprop ro.product.model') do set "model=%%i"
             :: 這行命令獲取設(shè)備的型號(hào)信息,并存儲(chǔ)在變量 model 中。
      
      for /f "tokens=2 delims=:" %%i in ('adb shell wm size ^| findstr "Physical size"') do set "screen_resolution=%%i"
             :: 這行命令獲取設(shè)備的屏幕分辨率信息。它首先執(zhí)行 adb shell wm size 命令獲取屏幕大小,然后通過(guò) findstr 過(guò)濾出包含 "Physical size" 的行,并使用冒號(hào)(:)作為分隔符提取分辨率。
      
      for /f "delims=" %%i in ('adb shell getprop ro.build.version.release') do set "android_version=%%i"
             :: 這行命令獲取設(shè)備的安卓版本信息,并存儲(chǔ)在變量 android_version 中。
      
      for /f "tokens=2 delims== " %%i in ('adb shell dumpsys package com.immotors.cockpitbuddy ^| findstr "versionName"') do set "app_version=%%i"
             :: 這行命令獲取指定應(yīng)用(com.XXX.XXXX)的應(yīng)用版本信息。它首先執(zhí)行 adb shell dumpsys package 命令,然后通過(guò) findstr 過(guò)濾出包含 "versionName" 的行,并使用等號(hào)(=)和空格作為分隔符提取應(yīng)用版本。
      
      for /f "delims=" %%i in ('powershell "Get-Date -Format 'yyyy-MM-dd HH:mm:ss'" ') do set "current_time=%%i"
             :: 這行命令使用 PowerShell 獲取當(dāng)前時(shí)間,并將其格式化為 yyyy-MM-dd HH:mm:ss,然后存儲(chǔ)在變量 current_time 中。
      
      
      :: 拼接品牌和型號(hào)
      set "device_name=!brand! !model!"
             :: 這行命令將品牌和型號(hào)拼接成一個(gè)新的字符串,并存儲(chǔ)在變量 device_name 中。
      
      
      :: 輸出結(jié)果
      echo 設(shè)備型號(hào):!device_name!
      echo 安卓版本:!android_version!
      echo 屏分辨率:!screen_resolution!
      echo 應(yīng)用版本:!app_version!
      echo 當(dāng)前時(shí)間:!current_time!
             :: 這些行輸出之前存儲(chǔ)的各個(gè)變量的值。
      
      echo.
      echo.
      endlocal
      pause

       

       

       

      三:批處理腳本的更多運(yùn)用

       

               通過(guò)以上代碼的認(rèn)識(shí),想必大家對(duì)批處理腳本的認(rèn)識(shí)更加深刻了吧。本質(zhì)上,批處理腳本就是一系列命令的集合體,它像是一個(gè)智能的助手,能夠按照我們預(yù)設(shè)的邏輯和流程,自動(dòng)化地完成一系列復(fù)雜的操作。而當(dāng)我們掌握了更多的cmd命令、adb命令、shell命令等強(qiáng)大工具時(shí),我們就能夠構(gòu)建出更加復(fù)雜、更加智能的業(yè)務(wù)流程。接下來(lái),我們?cè)傺苌恍┡幚砟_本的案例。

       

      場(chǎng)景應(yīng)用1:windows電腦微信多開(kāi)

      以下命令,超級(jí)簡(jiǎn)單,就3個(gè)知識(shí)點(diǎn),(下一個(gè)案例寫(xiě)到了開(kāi)機(jī)自動(dòng)啟,有需要可以看看):

      ①、start 命令用于啟動(dòng)一個(gè)單獨(dú)的“窗口”來(lái)運(yùn)行指定的程序或命令。這兒記住替換成自己電腦桌面的程序快捷方式“絕對(duì)路徑”即可。除了微信其他軟件實(shí)際上也是可以的。

      另外,在macOS上應(yīng)該是用: open /Applications/WeChat.app 

      ②、由于Program Files這個(gè)文件夾有空格,避免識(shí)別特殊符號(hào)報(bào)錯(cuò),所以在前面加了雙引號(hào),

      ③、上面有專(zhuān)門(mén)講過(guò)for循環(huán),咱們?cè)賮?lái)看一次:

           in (1,1,2) 定義了循環(huán)的參數(shù):
            第一個(gè)數(shù)字 1 是起始值。
            第二個(gè)數(shù)字 1 是步長(zhǎng),表示每次迭代時(shí)變量增加的值。
            第三個(gè)數(shù)字 2 是結(jié)束值,循環(huán)將一直執(zhí)行到變量等于這個(gè)值為止。

       

      @echo off  
          for /L %%i in (1,1,10) do (
              start "" "C:\Program Files\Tencent\WeChat\WeChat.exe"
          ) 
      exit

       

      應(yīng)用場(chǎng)景二:一個(gè)簡(jiǎn)易有效的自動(dòng)清理電腦垃圾文件的小工具

                以下命令整體來(lái)說(shuō),就是把幾條刪除命令整合到一起,分別刪除不同類(lèi)型的垃圾文件數(shù)據(jù)。羅列出來(lái)的命令,不涉及用戶(hù)數(shù)據(jù)文件,可以放心使用。

      ①命令解析:

           rd 用于刪除目錄,而 del 用于刪除文件。
           /f:強(qiáng)制刪除只讀文件。沒(méi)有這個(gè)參數(shù),系統(tǒng)不會(huì)刪除只讀文件,而是會(huì)提示錯(cuò)誤。
           /s:從指定目錄及其所有子目錄中刪除指定文件。沒(méi)有這個(gè)參數(shù),del命令只會(huì)刪除當(dāng)前目錄下的文件。
           /q:安靜模式,刪除文件時(shí)不詢(xún)問(wèn)確認(rèn)。
           *.*:這是一個(gè)通配符,表示匹配所有文件。
           %windir%:這是一個(gè)環(huán)境變量,代表Windows的安裝目錄。在大多數(shù)情況下,它指向C:\Windows,但這取決于Windows的安裝位置。
           %systemdrive%也是環(huán)境變量,指向的是一個(gè)根目錄(如C:\)
           %userprofile%:這是一個(gè)環(huán)境變量,它代表當(dāng)前用戶(hù)的個(gè)人文件夾的路徑:類(lèi)似于C:\Users\YourUsername的目錄,其中YourUsername是用戶(hù)的登錄名。

      ②自啟動(dòng):

             我們想要每天自動(dòng)清理,那么就需要把這個(gè).bat文件,創(chuàng)建一個(gè)快捷方式,然后將快捷方式放到自動(dòng)啟管理里邊,以后開(kāi)機(jī)就可以自動(dòng)來(lái)執(zhí)行文件,其實(shí)上面的微信多開(kāi),也可以這樣操作,這樣每天電腦開(kāi)機(jī),都可以幫我自動(dòng)取多開(kāi)微信,接下來(lái)看下windows開(kāi)機(jī)自啟動(dòng)怎么設(shè)置:

             第一步:通過(guò)鼠標(biāo)右鍵.bat文件,在菜單中創(chuàng)建快捷方式。

             第二步:然后按住win+r,彈出運(yùn)行窗口,在窗口內(nèi)輸入shell:startup,回車(chē)。這一步的操作是因?yàn)椋覀冸娔X的啟動(dòng)文件夾通常位于  C:\Users\[用戶(hù)名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 所以這里輸入 shell:startup 并按下 Enter 鍵,是用來(lái)來(lái)快速訪問(wèn)這個(gè)文件夾。所以大家也可以在自己的文件夾窗口上面的文件路徑里邊,直接貼上文件路徑,也是可以進(jìn)入啟動(dòng)文件夾的: %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup ;

             第三步:將步驟一創(chuàng)建的快捷方式拖進(jìn)啟動(dòng)文件夾就行了。

      @echo off
      echo 正在清理系統(tǒng)臨時(shí)文件,請(qǐng)稍候...
      del /f /s /q %systemdrive%*.tmp   REM 刪除系統(tǒng)驅(qū)動(dòng)器上所有.tmp臨時(shí)文件。
      del /f /s /q %systemdrive%*._mp   REM 刪除臨時(shí)文件。
      del /f /s /q %systemdrive%*.log   REM 刪除系統(tǒng)驅(qū)動(dòng)器上所有.log日志文件。
      del /f /s /q %systemdrive%*.gid   REM 應(yīng)用程序生成的文件。
      del /f /s /q %systemdrive%*.chk   REM 磁盤(pán)檢查過(guò)程中發(fā)現(xiàn)的文件碎片或丟失的文件片段。
      del /f /s /q %systemdrive%*.old   REM 刪除舊版本的文件。
      del /f /s /q %windir%*.bak    REM  刪除Windows目錄中所有的.bak備份文件。
      del /f /s /q %windir%\prefetch*.*    REM  刪除預(yù)讀取文件,這些文件用于加速Windows啟動(dòng)和應(yīng)用程序加載。
      rd /s /q %windir%\temp & md %windir%\temp    REM  刪除Windows臨時(shí)文件夾中的所有內(nèi)容,并重新創(chuàng)建該文件夾。
      del /f /q %userprofile%\recent*.*   REM  刪除最近訪問(wèn)的文檔列表。
      del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files*.*"    REM  刪除Internet臨時(shí)文件,這些文件包含瀏覽器緩存的內(nèi)容。
      del /f /s /q "%userprofile%\Local Settings\Temp*.*"    REM  刪除用戶(hù)臨時(shí)文件夾中的所有內(nèi)容。
      echo 清理完成!只刪除了系統(tǒng)臨時(shí)文件和Internet臨時(shí)文件。
      pause

       

       

      應(yīng)用場(chǎng)景三:一個(gè)文字小游戲

             以下是我在網(wǎng)上看到的一款迷宮小游戲,經(jīng)過(guò)改進(jìn),使它巧妙地根據(jù)用戶(hù)的不同選擇來(lái)執(zhí)行相應(yīng)的代碼邏輯。在游戲中,我們廣泛采用了“:”標(biāo)簽與goto命令的完美結(jié)合,實(shí)現(xiàn)了在不同游戲場(chǎng)景間的靈活跳轉(zhuǎn)。這種編程技巧不僅使游戲流程更加順暢,還極大地增強(qiáng)了游戲的互動(dòng)性和可玩性。

             此外,通過(guò)這款小游戲,我們深入學(xué)習(xí)了set /p命令的應(yīng)用。這一命令能夠輕松地收集用戶(hù)的輸入數(shù)據(jù),為游戲增添了更多的自定義和個(gè)性化元素。掌握這一輸入語(yǔ)句后,仿佛為我們打開(kāi)了一扇全新的窗戶(hù),讓我們看到了批處理腳本的無(wú)限可能,以后調(diào)用時(shí) %%variable%% 按照這個(gè)格式填入set /p 后面設(shè)置的變量名即可。

              想象一下,有了這一技能,我們可以將一些常用的cURL接口封裝成便捷的.bat文件。通過(guò)簡(jiǎn)單地輸入?yún)?shù),就能輕松實(shí)現(xiàn)接口的調(diào)用,無(wú)需再依賴(lài)postman或JMeter這樣的專(zhuān)業(yè)工具。這不僅提高了我們的工作效率,還讓我們?cè)诮涌跍y(cè)試方面擁有了更多的自主權(quán)。

              更進(jìn)一步地,我們還可以利用批處理腳本的強(qiáng)大功能,通過(guò)命令批量查找或修改文本、文件等內(nèi)容。這為我們處理大量數(shù)據(jù)提供了極大的便利,同時(shí)也激發(fā)了我們的創(chuàng)造力和想象力。小伙伴們,現(xiàn)在你們可以充分發(fā)揮自己的聰明才智,利用這一技能去探索更多未知的領(lǐng)域,創(chuàng)造出更多實(shí)用的工具和程序吧!

      @echo off
      title 簡(jiǎn)單文本冒險(xiǎn)游戲
            ::這行代碼設(shè)置命令行窗口的標(biāo)題為“簡(jiǎn)單文本冒險(xiǎn)游戲”。
            
      :game_loop 
      
              ::這是一個(gè)標(biāo)簽(label),在批處理腳本中用于標(biāo)記一個(gè)位置,以便使用goto命令跳轉(zhuǎn)到這個(gè)位置。
                :::end_game
                ::echo 游戲結(jié)束。
                ::set /p continue="如果需要繼續(xù)嘗試,請(qǐng)輸入“Y”: "
                ::if /i "%continue%"=="Y" goto game_loop
            ::文末的這段命令,就是對(duì)應(yīng)的,:game_loop標(biāo)簽開(kāi)始的地方,:end_game標(biāo)簽結(jié)束的地方,中間可以看成整個(gè)循環(huán)體,如果用戶(hù)在整個(gè)游戲結(jié)束以后,輸入了"Y",則通過(guò)goto game_loop,再次循環(huán)一遍。
      goto start
      
      :start
      echo 你身處一間黑暗的房間,你聽(tīng)到了一些聲音。
      echo 你想要做什么?
      echo.
      echo     1. 點(diǎn)亮房間
      echo     2. 打開(kāi)門(mén)
      echo     3. 尋找窗戶(hù)
      
      :input_start
      set /p choice="請(qǐng)輸入你的選擇(1-3): "
            ::使用set /p命令提示用戶(hù)輸入,并將輸入的值賦給變量choice。
      if "%choice%"=="1" goto light_room
      if "%choice%"=="2" goto open_door
      if "%choice%"=="3" goto find_window
            ::這三句話,會(huì)根據(jù)用戶(hù)的輸入不同,通過(guò)goto跳轉(zhuǎn)到不同的代碼塊去。
      echo 輸入有誤,請(qǐng)重新輸入:1或2或3。
      goto input_start
            ::如果輸入的不是123,那么就會(huì)提示用戶(hù)重新輸入正確的值,且跳轉(zhuǎn)到這個(gè)模塊的開(kāi)始地方,重新開(kāi)始這一代碼模塊。
      
      :light_room
      echo 你在房間里點(diǎn)燃了一盞燈,房間變得明亮了起來(lái)。
      echo 你看到墻上有一張地圖,你認(rèn)為這可能會(huì)幫助你脫離險(xiǎn)境。
      echo.
      echo     1. 研究地圖
      echo     2. 忽略地圖
      
      :input_light_room
      set /p choice="請(qǐng)輸入你的選擇(1-2): "
      if "%choice%"=="1" goto study_map
      if "%choice%"=="2" goto ignore_map
      echo 輸入有誤,請(qǐng)重新輸入:1或2。
      goto input_light_room
      
      :open_door
      echo 你打開(kāi)了門(mén),走出了這個(gè)房間,你發(fā)現(xiàn)你正在一個(gè)迷宮中。
      echo.
      echo     1. 沿著左邊走
      echo     2. 沿著右邊走
      
      :input_open_door
      set /p choice="請(qǐng)輸入你的選擇(1-2): "
      if "%choice%"=="1" goto left_path
      if "%choice%"=="2" goto right_path
      echo 輸入有誤,請(qǐng)重新輸入:1或2。
      goto input_open_door
      
      :left_path
      echo 你走了很久,最終你到達(dá)了出口,你成功逃脫了迷宮。That's great!
      goto end_game
      
      :right_path
      echo 你在迷宮中迷失了方向,最終你被困在里面,無(wú)法逃脫。Game over!
      goto end_game
      
      :find_window
      echo 你在房間里尋找窗戶(hù),但是你發(fā)現(xiàn)所有的窗戶(hù)都被封死了。Game over!
      echo.
      echo     1. 再次尋找
      echo     2. 回到房間中央
      
      :input_find_window
      set /p choice="請(qǐng)輸入你的選擇(1-2): "
      if "%choice%"=="1" goto find_window
      if "%choice%"=="2" goto start
      echo 輸入有誤,請(qǐng)重新輸入:1或2。
      goto input_find_window
      
      :study_map
      echo 你研究了地圖,最終你找到了出口。That's great!
      goto end_game
      
      :ignore_map
      echo 你忽略了地圖,最終你在迷宮中迷失了方向,無(wú)法逃脫。Game over!
      goto end_game
      
      :end_game
      echo.
      echo.
      echo.
      set /p continue="游戲結(jié)束。重玩請(qǐng)輸入“Y”: "
      if /i "%continue%"=="Y" goto game_loop
            ::這里是游戲結(jié)束后,會(huì)讓用戶(hù)選擇是否繼續(xù),并識(shí)別用戶(hù)的輸入是不是Y,然后重新開(kāi)始游戲。
      :end
      echo 謝謝你的游玩!

       應(yīng)用場(chǎng)景四:設(shè)置屏幕的旋轉(zhuǎn)方向

           本段,咱們來(lái)說(shuō)一下如何調(diào)整安卓設(shè)備的屏幕方向,從上面的業(yè)務(wù)代碼中,可以發(fā)現(xiàn),我們大量運(yùn)用坐標(biāo)拾取,那么橫屏和豎屏的按鈕坐標(biāo)肯定是不一樣的,所以我們需要保持一個(gè)固定的屏幕方向,而且業(yè)務(wù)中,也肯定會(huì)有很多場(chǎng)景是需要各種屏幕方向的。本段代碼主要分為兩步,先檢查當(dāng)前是否開(kāi)啟屏幕自動(dòng)旋轉(zhuǎn)功能。然后再執(zhí)行切換屏幕方向,這兒切換屏幕方向的命令,需要在禁止自動(dòng)旋轉(zhuǎn)時(shí)才能生效,所以我們需要先把設(shè)備確保關(guān)閉自動(dòng)旋轉(zhuǎn)。

      @echo off
      setlocal
      ::本段代碼是要將屏幕方向調(diào)整為橫屏,方便后續(xù)的操作
      
      ::先執(zhí)行adb shell settings get system accelerometer_rotation,查看執(zhí)行結(jié)果,如果為1=自動(dòng)旋轉(zhuǎn),則執(zhí)行adb shell settings put system accelerometer_rotation 0,(0=禁止旋轉(zhuǎn))
      ::然后,再執(zhí)行adb shell settings get system user_rotation,查看執(zhí)行結(jié)果,如果結(jié)果不為1=橫屏,則執(zhí)行adb shell settings put system user_rotation 1,
      
      adb shell settings get system accelerometer_rotation | findstr /r /c:"1$" >nul
      if %errorlevel% equ 0 (
          ::正在禁止自動(dòng)旋轉(zhuǎn)
          adb shell settings put system accelerometer_rotation 0
      )
      
      :: 檢查并設(shè)置用戶(hù)旋轉(zhuǎn)設(shè)置
      adb shell settings get system user_rotation | findstr /r /c:"1$" >nul
      if %errorlevel% neq 0 (
          :: 當(dāng)前不為橫屏,正在設(shè)置為橫屏
          adb shell settings put system user_rotation 1
      )
      :: 恢復(fù)打開(kāi)自動(dòng)旋轉(zhuǎn)
      adb shell settings put system accelerometer_rotation 1
      
      endlocal
      echo 操作完成。
      pause

       

       

      四:延伸內(nèi)容

       

       1、通過(guò)以上學(xué)習(xí),不難發(fā)現(xiàn),批處理腳本的基礎(chǔ)語(yǔ)法是cmd命令,和shell命令。下面,我列一些常用的命令。

      CMD命令大全:http://www.rzrgm.cn/xiaodi888/p/18633228

      Shell命令大全:http://www.rzrgm.cn/xiaodi888/p/18635097

       

      2、批處理腳本,在對(duì)移動(dòng)段設(shè)備進(jìn)行自動(dòng)化操作時(shí),需要用到大量的adb命令相關(guān)知識(shí),我準(zhǔn)備了一篇比較詳細(xì)的adb命令,以供參考,不全的地方,小伙伴們也可以留言補(bǔ)充交流。

      adb命令大全:http://www.rzrgm.cn/xiaodi888/p/18661990

       

       3、文章開(kāi)頭的一段Windows系統(tǒng)上的批處理腳本,我們現(xiàn)在來(lái)寫(xiě)一份效果一樣,但是可以在macOS系統(tǒng)上執(zhí)行的批處理腳本。有興趣的小伙伴們可以將兩份腳本對(duì)比一下,看看有什么不一樣的地方。

      #!/bin/bash
      
      # 查詢(xún)?cè)O(shè)備狀態(tài)
      DEVICE_STATE=$(adb get-state)
      
      # 判斷設(shè)備狀態(tài)
      if [ "$DEVICE_STATE" == "unknown" ]; then
        echo
        echo
        echo "請(qǐng)連接設(shè)備后,再重新執(zhí)行本程序"
        echo
        echo
        read -p "按任意鍵繼續(xù)..."
        exit 1
      else
        echo
        echo
        echo "設(shè)備已就緒,請(qǐng)勿手動(dòng)操作屏幕..."
      fi
      
      # 解鎖密碼的坐標(biāo),若密碼是不同的數(shù)字,則在下面添加不同的點(diǎn)擊語(yǔ)句,這里注釋即可。
      X_COORD=1290
      Y_COORD=1447
      
      # 獲取屏幕顯示狀態(tài)
      screenState=$(adb shell dumpsys window policy | grep "screenState=" | awk -F'=' '{print $2}' | xargs)
      
      # 判斷屏幕狀態(tài)并執(zhí)行操作
      if [ "$screenState" == "SCREEN_STATE_OFF" ]; then
        echo
        echo
        echo "正在喚醒設(shè)備..."
        adb shell input keyevent KEYCODE_POWER
        sleep 2
        
        echo
        echo
        # 打開(kāi)解鎖界面...
        adb shell input swipe 700 700 100 100 500
        sleep 2
        
        # 解鎖設(shè)備...
        for i in {1..6}; do
          adb shell input tap $X_COORD $Y_COORD
        done
        sleep 2
      
      elif [ "$screenState" == "SCREEN_STATE_ON" ]; then
        echo
        echo
        
        # 獲取設(shè)備鎖定狀態(tài)
        showing=$(adb shell dumpsys window policy | grep "showing=" | awk -F'=' '{print $2}' | xargs)
        
        if [ "$showing" == "true" ]; then
          echo
          echo
          # 打開(kāi)解鎖界面
          adb shell input swipe 700 700 100 100 500
          sleep 2
          
          echo
          # 解鎖設(shè)備...
          for j in {1..6}; do
            adb shell input tap $X_COORD $Y_COORD
          done
          sleep 2
        fi
      fi
      
      echo
      echo
      echo "啟動(dòng)應(yīng)用..."
      
      # 殺掉應(yīng)用
      adb shell am force-stop com.XXX.XXX
      sleep 2
      
      # 使用monkey啟動(dòng)應(yīng)用主界面
      adb shell monkey -p com.XXX.XXX 1 > /dev/null 2>&1
      sleep 2
      
      
      
      
      # 設(shè)置桌面路徑
      DESKTOP_PATH="$HOME/Desktop/test_photo"
      
      # 獲取當(dāng)前時(shí)間戳
      TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
      
      # 在設(shè)備上截圖,使用臨時(shí)文件名
      adb shell screencap -p /sdcard/Pictures/Screenshots/temp_AICreate.jpg
      
      # 重命名截圖文件,包含時(shí)間戳
      adb shell "mv /sdcard/Pictures/Screenshots/temp_AICreate.jpg /sdcard/Pictures/Screenshots/AICreate_${TIMESTAMP}.jpg"
      
      # 檢查目標(biāo)文件夾是否存在,如果不存在則創(chuàng)建
      TARGET_FOLDER="$DESKTOP_PATH"
      if [ ! -d "$TARGET_FOLDER" ]; then
          mkdir -p "$TARGET_FOLDER"
      fi
      
      # 保存截圖文件到電腦
      adb pull /sdcard/Pictures/Screenshots/AICreate_${TIMESTAMP}.jpg "$TARGET_FOLDER/AICreate_${TIMESTAMP}.jpg" 2>/dev/null >/dev/null
      
      # 在設(shè)備上刪除截圖文件
      adb shell "rm /sdcard/Pictures/Screenshots/AICreate_${TIMESTAMP}.jpg"
      
      
      
      # 輸出設(shè)備以及應(yīng)用信息
      BRAND=$(adb shell getprop ro.config.marketing_name)
      MODEL=$(adb shell getprop ro.product.model)
      SCREEN_RESOLUTION=$(adb shell wm size | grep "Physical size" | awk '{print $3}')
      ANDROID_VERSION=$(adb shell getprop ro.build.version.release)
      APP_VERSION=$(adb shell dumpsys package com.XXX.XXX | grep "versionName" | awk -F'=' '{print $2}' | xargs)
      CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
      
      # 輸出結(jié)果
      echo "設(shè)備型號(hào):$BRAND $MODEL"
      echo "安卓版本:$ANDROID_VERSION"
      echo "屏分辨率:$SCREEN_RESOLUTION"
      echo "應(yīng)用版本:$APP_VERSION"
      echo "當(dāng)前時(shí)間:$CURRENT_TIME"
      echo
      echo
      
      # 休眠設(shè)備(電源鍵),可以根據(jù)需要決定是否取消注釋
      # echo "正在使設(shè)備進(jìn)入休眠狀態(tài)..."
      # adb shell input keyevent KEYCODE_SLEEP
      
      echo
      echo
      echo "所有操作已完成!"
      read -p "按任意鍵退出..."

       


      結(jié)語(yǔ)

       

      親愛(ài)的朋友:
            希望本文中描述的問(wèn)題以及解決方案,可以幫助到您。當(dāng)然,我們深知,問(wèn)題和挑戰(zhàn)總是層出不窮,新的情況也在不斷涌現(xiàn)。如果讀者朋友您有更好的方案,或者在實(shí)際應(yīng)用中發(fā)現(xiàn)了文中的不足之處,請(qǐng)不吝分享您的寶貴建議。誠(chéng)摯地邀請(qǐng)每一位讀者加入我們的行列,共同完善這份教程。
          感謝您的閱讀與支持!

      Dear frends,

           We hope that the questions and solutions presented in this article can be of assistance to you. Of course, we are fully aware that problems and challenges are always emerging in an endless stream, and new situations are constantly arising. If you, our readers, have better solutions or have discovered any deficiencies in this article through practical application, please do not hesitate to share your valuable suggestions with us. We sincerely invite every reader to join us in continuously improving this tutorial.

      Thank you for your reading and support!
      See you,Parting is for better meeting!

       

       
      posted @ 2024-12-27 10:51  xiaodi888  閱讀(884)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 久久国产成人精品av| 九九热爱视频精品视频| 国内揄拍国内精品少妇国语| 亚洲精品不卡无码福利在线观看| 99国产精品欧美一区二区三区| 国产在线中文字幕精品| 色综合久久一区二区三区| 久久人人97超碰精品| 日日碰狠狠添天天爽超碰97| 国产一区二区不卡在线| 精品国产中文字幕av| 亚洲综合不卡一区二区三区| 中文字幕亚洲日韩无线码| 十四以下岁毛片带血a级| 国产人妻精品午夜福利免费 | 性xxxx搡xxxxx搡欧美| 欧美z0zo人禽交另类视频| 亚洲熟妇无码av另类vr影视| 一区二区中文字幕久久| 少妇人妻偷人精品无码视频新浪 | 精品无码午夜福利理论片| 高清无码爆乳潮喷在线观看| 国产高清一区二区三区视频| 免费人成网上在线观看网址| 亚洲精品日本久久一区二区三区| 国产亚洲精品久久久久久无亚洲| 久久99国产精品尤物| 欧美性插b在线视频网站| 东源县| 成A人片亚洲日本久久| 亚洲综合色区另类av| 亚洲 一区二区 在线| japan黑人极大黑炮| 亚洲国产精品日韩av专区| 久天啪天天久久99久孕妇| 亚洲av麻豆aⅴ无码电影| 成人动漫综合网| 日韩高清国产中文字幕| 国产欧美精品一区aⅴ影院| 欧美大胆老熟妇乱子伦视频| 无码国内精品人妻少妇|