Try   HackMD

批次檔常用片段

找出本地IP

方法一:

for /f "tokens=4" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do ( if NOT %%a == 1 if NOT %%a == 0.0.0.0 if NOT %%a == Default ( echo %%a ) )

方法二: 缺點: 會因為語系而受影響,而且可能找到不是想要的

for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do (echo %%i)

方法三: 找第三方僅回傳IP的網站 優點: 可找外部IP 缺點: 有的Server沒有curl

for /f "delims=" %%a in ( '"curl %ipUrl%"' ) do set (echo %%a)

取得主機名稱

echo %COMPUTERNAME%

取得日期時間

echo [%date:~0,10% %time:~0,8%]

顯示 [2022/10/23 23:09:39]

echo %date:/=-%

顯示 週四 2023-05-04

時間計算

REM 取得新時間 REM 使用變數 newTime:新時間 overflow:溢/借位(0:無 1:溢位 -1:借位) REM %1 小時增減 REM %2 分鐘增減 REM %3 秒數增減 :NewTime set newTime=[] set overflow=0 set _h_=%time:~0,2% set _m_=%time:~3,2% set _s_=%time:~6,2% REM 去掉開頭0,避免被當8進位 if %_s_:~0,1% == [0] set _s_=%_s_:~1,1% if %_m_:~0,1% == [0] set _m_=%_m_:~1,1% if %_h_:~0,1% == [0] set _h_=%_h_:~1,1% REM 處理秒數 if [%3] NEQ [] set /A _s_=%_s_%+%3 if %_s_% geq [60] ( set /A _s_=%_s_%-60 set /A _m_=%_m_%+1 ) if %_s_% LSS 0 ( set /A _s_=%_s_%+60 set /A _m_=%_m_%-1 ) REM 處理分鐘 if [%2] NEQ [] set /A _m_=%_m_%+%2 if %_m_% geq 60 ( set /A _m_=%_m_%-60 set /A _h_=%_h_%+1 ) if %_m_% LSS 0 ( set /A _m_=%_m_%+60 set /A _h_=%_h_%-1 ) REM 處理小時 if [%1] NEQ [] set /A _h_=%_h_%+%1 if %_h_% geq 24 ( set /A _h_=%_h_%-24 set overflow=1 ) if %_h_% LSS 0 ( set /A _h_=%_h_%+24 set overflow=-1 ) REM 補0 if %_s_% LSS 10 set _s_=0%_s_% if %_m_% LSS 10 set _m_=0%_m_% if %_h_% LSS 10 set _h_=0%_h_% set newTime=%_h_%:%_m_%:%_s_% EXIT /B 0

執行執PowerShell

powershell -noexit "& ""D:\PowerShellTraining\PowerShellScript.ps1"""
powershell -File C:\New\myscript.ps1

睡眠n秒

:Sleep @ping 127.0.0.1 -n %1 -w 1000 > nul EXIT /B 0

使用方法: delay 5 秒: call :Sleep 5

方法func

經驗

  1. 變數的生命週期是全域的
  2. function內的變數最好先宣告,不要在for/if內宣告,頂多變更變數就好,不然很容易無此變數
:Sleep REM %0 func名稱 REM %1 第一個參數 REM %2 第二個參數 @ping 127.0.0.1 -n %1 -w 1000 > nul EXIT /B 0

服務狀態

  1. 取得指定的服務狀態
  2. if 空值判斷
  3. if的變數用中括號包起來可避免 ( was unexpected at this time. 但數字資料應避免
> if [-1] LSS [0] (echo Y ) else (echo N) echo N > if [-1] LSS 0 (echo Y ) else (echo N) echo Y > if [3] LSS 1 (echo Y ) else (echo N) echo Y
@echo off set name=Dhcp call :getServiceState %name% if not [%state%] == [] ( echo %name% state= %state% ) goto :End REM 取得指定服務的狀態 REM 輸入: 服務名 REM 輸出: 狀態: 空(無此服務), RUNNING, STOPPED REM 使用變數: status :getServiceState set state= for /f "tokens=4 delims= " %%i in ('sc query %1 ^| find "STATE"') do set state=%%i EXIT /B 0 :End

提權

方法一:

REM 提權,沒成功就離開 %1 Mshta vbscript:CreateObject("Shell.Application").ShellExecute("Cmd.exe","/C ""%~0"" ::","","runas",1)(window.close)&&exit REM 回到腳本目錄 cd %~dp0

確認是否是系統管理員

參考: https://www.getit01.com/p20180124234541107/

fltmc > nul if %errorlevel% == 0 ( echo admin )

確認特定網站是否可以連線

@echo off setlocal set "website=https://example.com" curl -sSf %website% > nul if %errorlevel% neq 0 ( echo 無法連線到 %website%. 結束... exit /b 1 ) echo 可連線到 %website% . endlocal rem 在这里继续执行其他操作

當使用 curl 命令時,參數 -sSf 用來控制命令的行為。以下是這三個選項的解釋:

  1. -s:靜音模式(Silent Mode)

    • 當使用 -s 選項時,curl 不會顯示進度條或錯誤訊息。它會在背景執行,不會在終端上產生額外的輸出。
  2. -S:顯示錯誤(Show Errors)

    • -S 選項與 -s 相對應。即使使用了 -s 靜音模式,-S 選項也會使 curl 在發生錯誤時顯示錯誤訊息。
  3. -f:失敗時不顯示 HTTP 錯誤碼(Fail on HTTP Errors)

    • 當使用 -f 選項時,curl 不會顯示 HTTP 錯誤碼。如果請求失敗,它將返回非零的退出碼,但不會顯示具體的 HTTP 錯誤碼。

在您的情境下,這些選項的組合 -sSf 的意思是,curl 會在靜音模式下執行,只要發生錯誤,它就會返回非零的退出碼,但不會顯示錯誤訊息或 HTTP 錯誤碼。這是在批次處理腳本中測試連線時常用的方式,因為通常只關心連線是否成功,不需要詳細的輸出。

確認特定IP/Port是否有開

@echo off setlocal set "ip_address=127.0.0.1" set "port=80" powershell -command "Test-NetConnection -ComputerName %ip_address% -Port %port% -InformationLevel Quiet" if %errorlevel% neq 0 ( echo Cannot connect to %ip_address% on port %port%. Exiting... exit /b 1 ) echo Connection to %ip_address% on port %port% successful. endlocal rem 在这里继续执行其他操作

刪除特定規則名稱的資料夾

set "baseFolder=C:\Users\%user%\AppData\Local\Autodesk" rem 使用 for 迴圈來找出所有以 "DWG TrueView" 開頭的資料夾 for /d %%i in ("%baseFolder%\DWG TrueView*") do ( echo Deleting folder: %%i rmdir /s /q "%%i" )

取得特定網站完整憑證鍊

@REM 使用範例 call :extract_cert_pem www.google.com google_cert_chain.pem @REM 取得指定網站的憑證鏈恭鑰(pem格式) @rem Function to extract certificates from a site and save them @rem %1 - URL @rem %2 - output file :extract_cert_pem set "_found=" set "_tmp_cert=_tmp_cert.txt" REM echo Extracting certificates from %1 openssl s_client -connect %1:443 -showcerts < NUL > "%_tmp_cert%" 2> nul if errorlevel 1 ( echo Error: Failed to connect to %1 exit /b 1 ) if exist %2 ( del /Q %2 ) (for /f "delims=" %%i in (%_tmp_cert%) do ( echo %%i | findstr /C:"-----BEGIN CERTIFICATE-----" >nul if not errorlevel 1 (set "_found=1") if defined _found (echo %%i >> %2) echo %%i | findstr /C:"-----END CERTIFICATE-----" >nul if not errorlevel 1 (set "_found=") )) DEL /Q %_tmp_cert% exit /b