windows 的 cmd 指令參考
(結論:很難用,而且處處有侷限,很容易踩坑!)
@echo off
rem 切換編碼
rem 65001 代表 utf-8
rem 下面的 > nul 會把輸出消失掉
chcp 65001 > nul
rem 展示註解
goto lblNotes20250401093800
單行註解可用 rem
單行註解可用 ::
多行註解可用 goto
真的是非常的神奇!
但多行註解的標籤,每次都要想唯一的名字,比較麻煩。
:lblNotes20250401093800
rem 文字變數處理
set str1="哈囉,
echo %str1%
set str2=批次檔指令。"--'單引號雙引號都算是文字,沒有其他意涵'
echo %str2%
set str3=%str1%%str2%
echo %str3%
rem 兩個百分比符號 等同於 一個百分比符號
set strPercent=%%
echo %strPercent%
rem 字串擷取
rem
rem 指令為 %variable:~start,length%
rem start 是從零起算的,若用負數,則是倒數
set str4=一二三四五六七八九十甲乙丙丁戊己庚辛六七八九
echo %str4:~0,2%
:: 這會輸出 一二
echo %str4:~3,4%
:: 這會輸出 四五六七
echo %str4:~8%
:: 這會輸出 九十甲乙丙丁戊己庚辛六七八九
echo %str4:~-3%
:: 這會輸出 七八九
echo %str4:~-3,2%
:: 這會輸出 七八
rem 字串取代
rem
rem 指令為 %variable:old=new%
echo %str4:六七八=678%
:: 一二三四五678九十甲乙丙丁戊己庚辛678九
rem 數值變數處理
rem 雖然 /a 可以做數學運算,但只會是整數的運算,而且是無條件捨去喔!
set /a f1 = 38.7
set /a f2 = 7.97
set /a f3 = f1 + f2
set /a f4 = f1 - f2
set /a f5 = f1 * f2
set /a f6 = f1 / f2
set /a f7 = f1 %% f2
rem 整數可以正常計算,頂多計算後,小數點的部分被無條件捨去而已
set /a fShock1 = 41 * 7
:: 287
set /a fShock2 = 41 / 7
:: 5
rem 若一開始就有小數點,則解讀失敗,只剩下最前面的數字而已
set /a fShock3 = 41.3 * 7.5
:: 41
set /a fShock4 = 41.4 / 7.8
:: 41
echo f1 = %f1%
echo f2 = %f2%
echo %f1% + %f2% = %f3%
echo %f1% - %f2% = %f4%
echo %f1% * %f2% = %f5%
echo %f1% / %f2% = %f6%
echo %f1% mod %f2% = %f7%
echo 41 * 7 = %fShock1%
echo 41 / 7 = %fShock2%
echo 41.3 * 7.5 = %fShock3%
echo 41.4 / 7.8 = %fShock4%
rem 延遲變數展開
setlocal enabledelayedexpansion
set str5="你好,CMD!"
set /a iStart=1
set /a iLength=7
set str6=!str5:~%iStart%,%iLength%!
rem 第一回合先處理 %......%
rem 第二回合再處理 !......!
echo %str6%
:: 你好,CMD!
rem 條件判斷
rem 注意,if 沒有 and, or 可用!
rem 數值判斷
rem ------
rem equ 等於
rem neq 不等於
rem gtr 大於
rem lss 小於
rem geq 大於等於
rem leq 小於等於
set /a iNum1=38
rem 注意,右括號放哪邊可以很隨興,但左括號不能放到下一行喔!
if %iNum1% equ 38 ( echo %iNum1% equals to 38. )
:: 38 equals to 38.
rem 若一開始沒有左括號,則右括號就變成是文字了。
if %iNum1% equ 38 echo %iNum1% equals to 38. )
:: 38 equals to 38. )
rem 文字判斷
rem ------
rem == 等於
rem neq 不等於
rem gtr 大於
rem lss 小於
rem geq 大於等於
rem leq 小於等於
set strMessage1=不是 幸運七 也不是 幸運八
set strMessage2=幸運七
set strMessage3="幸運八 this is a test. It's good. 大家好"
set str7="幸運八 this is a test. It's good. 大家好"
rem 下面這幾行的預處理是為了避免字串中有雙引號而出現錯誤!
rem 這是把一個雙引號,變成兩個雙引號。
set strCmpMsg1=%strMessage1:"=""%
set strCmpMsg2=%strMessage2:"=""%
set strCmpMsg3=%strMessage3:"=""%
set strCmp7=%str7:"=""%
rem 用雙引號包夾,是為了避免字串中有空格存在。
if "%strCmp7%"=="%strCmpMsg1%" (
echo 'block1'
echo .str7 是 %strMessage1%
) else (
if "%strCmp7%"=="%strCmpMsg2%" (
echo 'block2'
echo ..str7 是 %strMessage2%
) else (
if "%strCmp7%"=="%strCmpMsg3%" (
echo 'block3'
echo ...str7 是 %strMessage3%
)
)
)
set str8=好的
set str8=%str8%%str8%
if %str8% neq 壞了 ( echo %str8% )
set str9_1=ABc0x
set str9_2=ABc0x
if %str9_1% == %str9_2% ( echo '-==-' )
if %str9_1% gtr %str9_2% ( echo '-gtr-' )
if %str9_1% lss %str9_2% ( echo '-lss-' )
if %str9_1% geq %str9_2% ( echo '-geq-' )
if %str9_1% leq %str9_2% ( echo '-leq-' )
rem 判斷檔案存在與否
set strFilename="822362.jpg"
if exist %strFilename% ( echo %strFilename% 檔案存在 ) else ( echo %strFilename% 檔案不存在 )
rem 忽略大小寫的文字判斷
set x1=Apple
set x2=applE
if /i %x1%==%x2% ( echo the same! ) else ( echo different! )
rem 迴圈處理
rem 天哪,迴圈的變數名稱,只能一個字(中英文都可以,但只能一個字)!!!!!!
for %%z in (1 2 3 4 5) do echo z = %%z
for %%蛋 in (1 2 3 4 5) do echo 蛋 = %%蛋
rem for /L %%變數 in (開始, 增量, 結束) do (命令)
for /l %%增 in (1, 2, 20) do ( echo 增 = %%增 )
for /l %%減 in (20, -3, 3) do ( echo 減 = %%減 )
rem 讀取檔案中,每個非空白行的第一個詞(不含左右空白)。
for /f %%i in (try.bat) do ( echo %%i )
rem 讀取檔案中,每行的文字。
for /f "tokens=* delims=" %%i in (try.bat) do ( echo.%%i )
rem 會用 echo 後面緊跟著小數點,再跟著變數名稱,這是因為可以防止空白作怪。
rem 當 echo 後面變數是空的的時候,就會出現 ECHO is on. 或 ECHO is off. 的情形。
rem 讀取指令的輸出
for /f %%i in ('dir D:\20241122_影音剪輯 /s/a/b') do ( echo %%i )
rem 讀取當前路徑下,所有子目錄名稱
for /d %%i in (*) do ( echo %%i )
rem 讀取所有目錄名稱(包含隱藏的資料夾)
for /f %%i in ('dir /ad/b') do ( echo %%i )
rem 讀取c槽windows底下,第一層子目錄名稱
for /d %%i in (c:\windows\*) do ( echo %%i )
rem 讀取所有子資料夾與檔案
for /r "D:\20241122_影音剪輯" %%i in (*) do ( echo %%i )
rem 進行類似 split 的拆分,當資料超過26個的時候,那就要自求多福了。
set strFruits=蘋果,香蕉,橘子,藍莓
for /f "tokens=1-4 delims=," %%a in ("%strFruits%") do (
echo 水果1 = %%a
echo 水果2 = %%b
echo 水果3 = %%c
echo 水果4 = %%d
)
rem 下面 split 的拆分,可以閃過變數名稱不夠用的問題。
rem 可用空白或逗號做分隔。
set "str10=蘋果,香蕉,橘子,藍莓"
for %%z in (%str10%) do ( echo 水果 = %%z )
rem 要關閉 延遲變數展開,這樣驚嘆號才不會被變成是指令
rem 注意,半形空白和逗號都被當成分隔符號囉!
setlocal disabledelayedexpansion
for %%i in ("This is a test!" 大家好 Hello, world!) do ( echo _%%i )
:: _"This is a test!"
:: _大家好
:: _Hello
:: _world!
rem 日期時間處理 (年月日時分秒,星期幾......)
echo 日期:%date%
echo 時間:%time%
rem 四個token的先後順序,要實際在作業系統中跑一遍才會知道,而且也有可能變更,要特別注意!
for /f "tokens=1-4 delims=/ " %%a in ("%date%") do (
set str星期=%%a
set str年=%%b
set str月=%%c
set str日=%%d
)
for /f "tokens=1-3 delims=:" %%a in ("%time%") do (
set str時=%%a
set str分=%%b
set str秒=%%c
rem 在這個區塊中,只能有 %%a, %%b, %%c
rem 當你要操控 str秒,那是會失敗的!
)
rem 要操控 str秒 只能在區塊之外!!!
set str秒=%str秒:~0,2%
echo %str年%-%str月%-%str日% %str時%:%str分%:%str秒% %str星期%
資訊科技 / information technology
作業系統
windows 7, windows 10, windows 11 [ x86, x64 ]
raspbian, raspberry pi os, debian [ arm64 ]
ubuntu [ x86, x64, arm64 ]
影像
krita ( - painter )
inkscape ( - illustrator )
gimp ( - photoshop )
fastStone image viewer
聲音
audacity
影音
blender ( - 3ds max )
VLC media player
文字
notepad++, geany
辦公
libreoffice, onlyoffice, openoffice, wpsoffice ( - ms office )
文件
Cute PDF Writer
foxit pdf reader, adobe acrobat reader
PDF24 Creator
PDFsam
TTR PDF To JPG
瀏覽器
firefox, chrome, brave, edge, safari, opera
資料庫(含管理)
sqlite, mariadb, mysql, sql server
DB Browser for SQLite
phpMyAdmin
SQL Server Management Studio
程式語言(含網頁語言)
javascript, php, python, c#, micropython, html, css
網站伺服器
apache, iis, ......
物聯網(IOT)
arduino, esp32, raspberry pi
人工智慧(含機器學習等)
openai, deepseek, ollama, ......
tensorflow(+keras), pytorch
QR Code 產生器 - 使用Python
# sudo apt install python3-qrcode
import qrcode
# vCard 內容(確保使用 CRLF 換行)
vcard = """BEGIN:VCARD\r
VERSION:3.0\r
FN:John Doe\r
ORG:Example Corp\r
TEL:+1234567890\r
EMAIL:john.doe@example.com\r
END:VCARD"""
# 產生 QR Code
qr = qrcode.make(vcard)
# 儲存 QR Code 圖片
qr.save("vcard_qrcode.png")
print("QR Code 已成功產生!")
ollama,從前端的 javascript 執行
(注意,在 ollama 那一台機器上,要設定過 OLLAMA_ORIGINS=*,才不會被 CORS 規則給限制了。)
<script>
// 執行函式 - 注意同源政策(CORS)的限制!
window.onload=async function()
{
var strUrl="http://192.168.0.99:11434/api/generate";
var strModel="llama3.1";
var strPrompt="請幫我說明一下下面的敘述。\n\n佛以此願行。與眾生莊嚴四種淨土。\n又以此願行。莊嚴成一句洪名。 ";
var oJsonInput={ model: strModel, prompt: strPrompt, stream: false };
// 方法一
fetchOllamaResponseAsync(strUrl, oJsonInput);
// 方法二
await fetchOllamaResponseSync(strUrl, oJsonInput);
}
function fetchOllamaResponseAsync(strUrl, oJsonInput)
{
console.log("開始執行非同步方法1!");
fetch(
strUrl,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(oJsonInput)
}
)
.then(oResponse => oResponse.json())
.then(oJson => console.log('1:',oJson.response))
.catch(oError => console.error(oError));
}
async function fetchOllamaResponseSync(strUrl, oJsonInput)
{
console.log("開始執行同步方法2!");
try
{
const oResponse=await fetch(
strUrl,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(oJsonInput)
}
);
if(!oResponse.ok)
{
throw new Error(`HTTP error! Status: ${oResponse.status}`);
}
const oJson=await oResponse.json();
console.log('2:',oJson.response); // 取得完整的回應內容
}
catch(oError)
{
console.error("Error fetching Ollama response:", oError);
}
}
</script>