2018年6月28日 星期四
Windows Print Screen 按鍵功能
Print Screen為鍵盤上所提供相容於Windows系統的按鍵,通常縮寫為PrtSc。
PrtSc
將全螢幕的圖像存入隨機記憶體,使用Ctrl + V將圖像讀出。
Alt + PrtSc
將應用程式的圖像存入隨機記憶體,使用Ctrl + V將圖像讀出。
Win8/Win10
Win + PrtSc
將全螢幕的圖像存入PNG檔到圖片資料夾。
Win + Alt + PrtSc
將應用程式的圖像存入PNG檔到影片資料夾。
Labels:
Windows
2018年6月20日 星期三
[Batch] 取得字元的ASCII Number
在寫Batch script的時候,有時候會需要用到某些字元的 ASCII Number 來做判斷(ex: 判斷
英文字母的排序),但是cmd.exe並沒有提供這樣的服務,這時候可以應用一個非官方文件
所記載的動態變數 %=ExitCodeAscii% 來達成目的。
%=ExitCodeAscii% 的值為最後一個額外的cmd.exe所回傳的ExitCode的ASCII character。
Example: 找出 "A" 的ASCII Number
Output:
%=ExitCodeAscii% 的值為最後一個額外的cmd.exe所回傳的ExitCode的ASCII character。
Example: 找出 "A" 的ASCII Number
@echo off
setlocal EnableDelayedExpansion
set char=A
for /l %%a in (32,1,126) do (
cmd /c exit %%a
if "!=exitcodeAscii!" EQU "%char%" echo %%a
)
setlocal EnableDelayedExpansion
set char=A
for /l %%a in (32,1,126) do (
cmd /c exit %%a
if "!=exitcodeAscii!" EQU "%char%" echo %%a
)
Output:
65
[Batch] 延遲變數展開 (EnableDelayedExpansion)
在剛開始寫Batch的迴圈(for)的時候,都會遇到一個問題,就是在迴圈中,想要去改變(set)
某個變數的值,可是卻沒有作用。
Example:
set var=0
for %%a in (1 1 1 1 1) do (
set /a var+=%%a
echo %var%
)
echo %var%
for %%a in (1 1 1 1 1) do (
set /a var+=%%a
echo %var%
)
echo %var%
Output:
0
0
0
0
0
5
0
0
0
0
5
上面範例原意是想讓 var在每次的迴圈中都 +1,最後的值會是 5。可是在迴圈中每次 echo出的值都是一開始的 var值 0。
原因是 var在 batch file被解析的時候就會提前展開,所以在迴圈中會 echo出一開始被展開的值。要得到預想的結果就要使用
setlocal EnableDelayedExpansion來延遲變數展開,使其在執行的階段才會被展開。
Example:
setlocal EnableDelayedExpansion
set var=0
for %%a in (1 1 1 1 1) do (
set /a var+=%%a
echo !var!
)
echo %var%
set var=0
for %%a in (1 1 1 1 1) do (
set /a var+=%%a
echo !var!
)
echo %var%
Output:
1
2
3
4
5
5
2
3
4
5
5
注意在取值時,要延遲展開的變數需使用 !var!才會有效果。
與 setlocal EnableDelayedExpansion對應的是 setlocal DisableDelayedExpansion,其作用為取消延遲變數展開。
2018年6月11日 星期一
記憶體(SDRAM) 的規格標示
以DDR4為例,目前在市面上常見的產品有:DDR4 2133、DDR4 2400、DDR4 2666及DDR4 3200
等。
用DDR4 2400來說,有時候也會看到PC4-19200等其他標示,這裡的DDR4 2400的"2400", 單位是MT/s (megatransfers per second),意義上代表每秒鐘可完成2400×106次傳輸操作。
而目前記憶體DIMM的Bus width為8 Bytes(64 Bits),表示DDR4 2400的資料傳輸速率為19200 MB/s (8 Byte × 2400 MT/s),所以PC4-19200的"19200"就代表記憶體傳輸速率的峰值(Peak Transfer Rate),單位為MB/s。
SMBIOS Type 17中的"Speed"欄位,在先前的SPEC (3.0.0 與之前的版本)中,是用時脈來表示記 憶體速度,單位是MHz。在之後的SPEC,"Speed"欄位則改用MT/s來表示。以DDR4 2400為例,"Speed"所 要填的值為0x0960(2400)(MT/s),而若是SMBIOS 3.0.0以前,就要填為0x4B0(1200)(MHz)。
記憶體的MHz和MT/s間轉換,就是將MHz的數值×2就能獲得MT/s,因為資料傳輸同時計入時脈 的正緣與負緣。
用DDR4 2400來說,有時候也會看到PC4-19200等其他標示,這裡的DDR4 2400的"2400", 單位是MT/s (megatransfers per second),意義上代表每秒鐘可完成2400×106次傳輸操作。
而目前記憶體DIMM的Bus width為8 Bytes(64 Bits),表示DDR4 2400的資料傳輸速率為19200 MB/s (8 Byte × 2400 MT/s),所以PC4-19200的"19200"就代表記憶體傳輸速率的峰值(Peak Transfer Rate),單位為MB/s。
SMBIOS Type 17中的"Speed"欄位,在先前的SPEC (3.0.0 與之前的版本)中,是用時脈來表示記 憶體速度,單位是MHz。在之後的SPEC,"Speed"欄位則改用MT/s來表示。以DDR4 2400為例,"Speed"所 要填的值為0x0960(2400)(MT/s),而若是SMBIOS 3.0.0以前,就要填為0x4B0(1200)(MHz)。
記憶體的MHz和MT/s間轉換,就是將MHz的數值×2就能獲得MT/s,因為資料傳輸同時計入時脈 的正緣與負緣。
2018年6月10日 星期日
System Management BIOS(SMBIOS) 概述
SMBIOS是由DMTF(https://www.dmtf.org/)組織所制定及維護的業界規範,其目的在於讓主機
板及系統廠商有統一的標準格式,來描述產品相關的管理資訊,並供給作業系統使用。
本篇文章以SMBIOS 3.2.0 Specification 當作參考:
DSP0134_3.2.0
SMBIOS Entry Point主要可以區分為較早期的版本SMBIOS 2.1及現在的SMBIOS 3.0版本,以32-bit和64-bit作為分別。
Legacy
在實體記憶體位址0x000F0000-0x000FFFFF之間,尋找"_SM_"(SMBIOS 2.1) 或者"_SM3_"(SMBIOS 3.0)字串,就可以訪問到其Entry Point structure。
UEFI
透過EFI Configuration Table和SMBIOS GUID來進行訪問。
SMBIOS 2.1為SMBIOS_TABLE_GUID{EB9D2D31-2D88-11D3-9A16-0090273FC14D}。
SMBIOS 3.0為SMBIOS3_TABLE_GUID{F2FD1544-9794-4A2C-992E-E5BBCF20E394}。
得到SMBIOS Entry Point 之後,就可以透過其"Structure Table Address"來訪問 SMBIOS structure。
EDK2中定義的 SMBIOS Entry Point結構
formmated section以長度4 byte的header起始,而接在header之後的資料格式根據Structure type有所不同。 optional unformed section則由文字字串組成。
SMBIOS Structure的Text String區塊接在Structure的formatted section之後。而其是選擇性的, SMBIOS的Structure內並不一定要含有Text String。每個Text String的結尾都是null character(00h)。
在SMBIOS structure的formatted section中,需要使用Text String的時候,就需要填上一個非0 值。假設其填值為02h,就代表這個string field要去參考Text String區塊中的第二個Text String。若其 填為0,就代表此string field不使用Text String。
SPEC中的BIOS Infomation(Type 0)範例:
使用Text String的BIOS Infomation(Type 0)
沒有使用Text String的BIOS Infomation(Type 0)
本篇文章以SMBIOS 3.2.0 Specification 當作參考:
DSP0134_3.2.0
SMBIOS entry point
SMBIOS Entry Point主要可以區分為較早期的版本SMBIOS 2.1及現在的SMBIOS 3.0版本,以32-bit和64-bit作為分別。
SMBIOS Entry Point structure的訪問方法
Legacy
在實體記憶體位址0x000F0000-0x000FFFFF之間,尋找"_SM_"(SMBIOS 2.1) 或者"_SM3_"(SMBIOS 3.0)字串,就可以訪問到其Entry Point structure。
UEFI
透過EFI Configuration Table和SMBIOS GUID來進行訪問。
SMBIOS 2.1為SMBIOS_TABLE_GUID{EB9D2D31-2D88-11D3-9A16-0090273FC14D}。
SMBIOS 3.0為SMBIOS3_TABLE_GUID{F2FD1544-9794-4A2C-992E-E5BBCF20E394}。
得到SMBIOS Entry Point 之後,就可以透過其"Structure Table Address"來訪問 SMBIOS structure。
EDK2中定義的 SMBIOS Entry Point結構
typedef struct {
UINT8 AnchorString[5];
UINT8 EntryPointStructureChecksum;
UINT8 EntryPointLength;
UINT8 MajorVersion;
UINT8 MinorVersion;
UINT8 DocRev;
UINT8 EntryPointRevision;
UINT8 Reserved;
UINT32 TableMaximumSize;
UINT64 TableAddress;
} SMBIOS_TABLE_3_0_ENTRY_POINT;
UINT8 AnchorString[5];
UINT8 EntryPointStructureChecksum;
UINT8 EntryPointLength;
UINT8 MajorVersion;
UINT8 MinorVersion;
UINT8 DocRev;
UINT8 EntryPointRevision;
UINT8 Reserved;
UINT32 TableMaximumSize;
UINT64 TableAddress;
} SMBIOS_TABLE_3_0_ENTRY_POINT;
SMBIOS Structure
formmated section以長度4 byte的header起始,而接在header之後的資料格式根據Structure type有所不同。 optional unformed section則由文字字串組成。
SMBIOS Structure Header
| Offset   | Name   | Length   | Description   |
| 00h   | Type   | BYTE   | Structure的類型。Type 00h到 7Fh是預留給SMBIOS spec定義,而Type 80h到 FFh則讓系統廠可以自行 定義。  |
| 01h   | Length   | BYTE   | Structure formatted section的資料長度,從header的Type開始算起,不包含文字字串的 部分  |
| 02h   | Handle   | WORD   | 用來識別不同structure實體的一組16 bit number,其值範圍是從 FF00h到 FFFFh。  |
Text String
SMBIOS Structure的Text String區塊接在Structure的formatted section之後。而其是選擇性的, SMBIOS的Structure內並不一定要含有Text String。每個Text String的結尾都是null character(00h)。
在SMBIOS structure的formatted section中,需要使用Text String的時候,就需要填上一個非0 值。假設其填值為02h,就代表這個string field要去參考Text String區塊中的第二個Text String。若其 填為0,就代表此string field不使用Text String。
SPEC中的BIOS Infomation(Type 0)範例:
使用Text String的BIOS Infomation(Type 0)
BIOS_Info LABEL BYTE
db    0 ; Indicates BIOS Structure Type
db    13h ; Length of information in bytes
dw    ? ; Reserved for handle
db    01h ; String 1 is the Vendor Name
db    02h ; String 2 is the BIOS version
dw    0E800h ; BIOS Starting Address
db    03h ; String 3 is the BIOS Build Date
db    1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char ; BIOS Characteristics
db    0 ; BIOS Characteristics Extension Byte 1
db    'System BIOS Vendor Name',0 ;
db    '4.04',0   ;
db    '00/00/0000',0 ;
db    0 ; End of strings
db    0 ; Indicates BIOS Structure Type
db    13h ; Length of information in bytes
dw    ? ; Reserved for handle
db    01h ; String 1 is the Vendor Name
db    02h ; String 2 is the BIOS version
dw    0E800h ; BIOS Starting Address
db    03h ; String 3 is the BIOS Build Date
db    1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char ; BIOS Characteristics
db    0 ; BIOS Characteristics Extension Byte 1
db    'System BIOS Vendor Name',0 ;
db    '4.04',0   ;
db    '00/00/0000',0 ;
db    0 ; End of strings
沒有使用Text String的BIOS Infomation(Type 0)
BIOS_Info LABEL BYTE
db    0 ; Indicates BIOS Structure Type
db    13h ; Length of information in bytes
dw    ? ; Reserved for handle
db    00h ; No Vendor Name provided
db    00h ; No BIOS version provided
dw    0E800h ; BIOS Starting Address
db    00h ; No BIOS Build Date provided
db    1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char ; BIOS Characteristics
db    0 ; BIOS Characteristics Extension Byte 1
dw    0000 ; Structure terminator
db    0 ; Indicates BIOS Structure Type
db    13h ; Length of information in bytes
dw    ? ; Reserved for handle
db    00h ; No Vendor Name provided
db    00h ; No BIOS version provided
dw    0E800h ; BIOS Starting Address
db    00h ; No BIOS Build Date provided
db    1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char ; BIOS Characteristics
db    0 ; BIOS Characteristics Extension Byte 1
dw    0000 ; Structure terminator
2018年6月8日 星期五
HTML escape characters
| Symbol | Entity Name |
| space |   |
| en space |   |
| em space |   |
| & | & |
| < | &lt; |
| > | &gt; |
| " | &quot; |
Labels:
HTML/CSS
bcdedit - Windows 管理BCD存放區的工具
本篇文章參考網頁:
bcdedit-command-line-options
在Windows內建管理BCD(Boot Configuration Data) 存放區(store)的工具,可以用來修改開機順序,或其他與開機相關操作。
bcdedit /COMMAND [ARGUMENT1] [ARGUMENT2]
bcdedit /? [COMMAND] 輸出bcdedit 命令列表。若有COMMAND參數,則輸出COMMAND的詳細資訊。
export bcdedit /export <FILENAME> 匯出系統存放區的內容至檔案,這個檔案可以用import命令來還原系統存放區,此命令只對系統存放區有效。
import bcdedit /import <FILENAME> [/clean] 能將export的檔案匯入系統存放區,此命令只對系統存放區有效。
store bcdedit /store <FILENAME> 指定要操作的存放區。如果沒有指定,bcdedit將會以系統存放區(system store)進行操作。
set bcdedit /set [{<id>}] <datatype> <value> [/addfirst|/addlast|/remove] 設定entry項目的值。
enum bcdedit /enum [<type>|<id>] 列出存放區中的entries
displayorder bcdedit /displayorder <id> [...] [/addfirst|/addlast|/remove] 調整開機管理程式顯示的選項順序
dbgsetting bcdedit /dbgsetting [ <debugtype> [TARGETNAME:<targetname>] ] 設定系統的全域Debugger,不加參數則顯示目前全域Debugger設定。
<debugtype> - 指定Debugger類型。可為SERIAL、USB和NET等。
<targetname> - 用於USB偵錯,指定用於偵錯的USB目標名稱。
debug bcdedit /debug [<id>] { ON | OFF } 開啟或關閉開機項目的Kernel Debugger。若id沒有指定,則開啟或關閉目前的開機選項的Kernel Debugger。
1. 列出系統存放區所有firmware applications
bcdedit /enum firmware
2. 找到要使用於開機的USB Device的firmware application,並記錄其id(identifier)。
3. 將fwbootmgr entry的USB device選項用displayorder設到最前面。
bcdedit /set {fwbootmgr} displayorder <id> /addfirst
4. 重新開機,這時系統應該會boot進USB device的image中。
bcdedit-command-line-options
在Windows內建管理BCD(Boot Configuration Data) 存放區(store)的工具,可以用來修改開機順序,或其他與開機相關操作。
bcdedit /COMMAND [ARGUMENT1] [ARGUMENT2]
HELP
bcdedit /? [COMMAND] 輸出bcdedit 命令列表。若有COMMAND參數,則輸出COMMAND的詳細資訊。
操作存放區
export bcdedit /export <FILENAME> 匯出系統存放區的內容至檔案,這個檔案可以用import命令來還原系統存放區,此命令只對系統存放區有效。
import bcdedit /import <FILENAME> [/clean] 能將export的檔案匯入系統存放區,此命令只對系統存放區有效。
store bcdedit /store <FILENAME> 指定要操作的存放區。如果沒有指定,bcdedit將會以系統存放區(system store)進行操作。
修改entry的項目
set bcdedit /set [{<id>}] <datatype> <value> [/addfirst|/addlast|/remove] 設定entry項目的值。
輸出控制
enum bcdedit /enum [<type>|<id>] 列出存放區中的entries
控制開機管理程式的命令
displayorder bcdedit /displayorder <id> [...] [/addfirst|/addlast|/remove] 調整開機管理程式顯示的選項順序
Debugging
dbgsetting bcdedit /dbgsetting [ <debugtype> [TARGETNAME:<targetname>] ] 設定系統的全域Debugger,不加參數則顯示目前全域Debugger設定。
<debugtype> - 指定Debugger類型。可為SERIAL、USB和NET等。
<targetname> - 用於USB偵錯,指定用於偵錯的USB目標名稱。
debug bcdedit /debug [<id>] { ON | OFF } 開啟或關閉開機項目的Kernel Debugger。若id沒有指定,則開啟或關閉目前的開機選項的Kernel Debugger。
使用bcdedit在Windows下調整boot order(使用USB Device開機)
1. 列出系統存放區所有firmware applications
bcdedit /enum firmware
2. 找到要使用於開機的USB Device的firmware application,並記錄其id(identifier)。
3. 將fwbootmgr entry的USB device選項用displayorder設到最前面。
bcdedit /set {fwbootmgr} displayorder <id> /addfirst
4. 重新開機,這時系統應該會boot進USB device的image中。
2018年6月7日 星期四
diskpart - Windows 管理硬碟與分割區的工具
diskpart是Windows下用以管理及操作磁碟與分割的CLI工具。
partition - 建立一個磁碟分割。
efi - 建立一個EFI系統磁碟分割。
extended - 建立一個延伸磁碟分割。
logical - 建立邏輯磁碟區。
msr - 建立一個Mircrosoft保留的磁碟分割。
primary - 建立主要磁碟分割。
volume - 建立一個磁碟區。
vdisk - 建立虛擬磁碟檔案。
OPTIONS
fs=<FS> - 指定檔案系統的類型。ex: fs=ntfs。
label=<"LABEL"> - 指定磁碟區標籤。ex: label=D。
quick - 執行快速格式化。
disk - 列出磁碟。
partition - 列出所選磁碟上的分割。
volume - 列出磁碟區。
vdisk - 列出虛擬磁碟。
disk - 將操作移至所選磁碟。
partition - 將操作移至所選分割。
volume - 將操作移至所選磁碟區。
vdisk - 將操作移至所選虛擬磁碟。
OPTIONS
desired=<N> - 指定要縮減的磁碟區空間大小(MB)。ex: desired=100000。
querymax - 回傳所選磁碟區可縮減的空間最大值(磁碟區上的可用空間),但如果
應用程式正在存取磁碟區,此值可能會改變。
diskpart也能寫成批次檔形式,可以參考:
diskpart-scripts-and-examples
執行diskpart script
diskpart /s example.txt
assign
指派一個磁碟機代號或掛接點到所選擇磁碟區。clean
清除磁碟上所有資訊,可以用以清除磁碟上的分割區。create
建立一個磁碟區、磁碟分割或虛擬磁碟。partition - 建立一個磁碟分割。
efi - 建立一個EFI系統磁碟分割。
extended - 建立一個延伸磁碟分割。
logical - 建立邏輯磁碟區。
msr - 建立一個Mircrosoft保留的磁碟分割。
primary - 建立主要磁碟分割。
volume - 建立一個磁碟區。
vdisk - 建立虛擬磁碟檔案。
exit
離開diskpart。format
格式化磁碟區或磁碟分割。OPTIONS
fs=<FS> - 指定檔案系統的類型。ex: fs=ntfs。
label=<"LABEL"> - 指定磁碟區標籤。ex: label=D。
quick - 執行快速格式化。
list
列出物件的清單。disk - 列出磁碟。
partition - 列出所選磁碟上的分割。
volume - 列出磁碟區。
vdisk - 列出虛擬磁碟。
select
將襙作移至所選物件。disk - 將操作移至所選磁碟。
partition - 將操作移至所選分割。
volume - 將操作移至所選磁碟區。
vdisk - 將操作移至所選虛擬磁碟。
shrink
縮小所選磁碟區。OPTIONS
desired=<N> - 指定要縮減的磁碟區空間大小(MB)。ex: desired=100000。
querymax - 回傳所選磁碟區可縮減的空間最大值(磁碟區上的可用空間),但如果
應用程式正在存取磁碟區,此值可能會改變。
diskpart批次檔
diskpart也能寫成批次檔形式,可以參考:
diskpart-scripts-and-examples
執行diskpart script
diskpart /s example.txt
Batch script 筆記
參考網頁
windows-commands
https://ss64.com/nt/
https://en.wikibooks.org/wiki/Windows_Batch_Scripting
%n 還可以使用下列擴充語法,詳細內容可以使用 call /? 來參考:
%~1 - 展開 %1 並移除包圍的引號(")
%~f1 - 展開 %1 為一個完整合格路徑名稱
%~d1 - 只展開 %1 為磁碟機代號
%~p1 - 只展開 %1 為路徑
%~n1 - 只展開 %1 為檔名
%~x1 - 只展開 %1 為副檔名
%~z1 - 顯示 %1 的檔案大小
batch檔所在的目錄,常與%CD%作為比較,%CD%代表的是當前的工作目錄。
都會重新計算一次。
%CD%
展開當前工作目錄的字串。
%RANDOM%
展開一個範圍0到32767間的整數。
%ERRORLEVEL%
展開目前ERRORLEVEL的值。
參考範例
在Batch 中取出字元的ASCII Number
清除原有內容後再寫入
COMMAND >> FILENAME
在原有內容後寫入
COMMAND < FILENAME
將FILENAME的內容傳入COMMAND
COMMAND_A | COMMAND_B
將COMMAND_A的output傳入COMMAND_B
不印出輸出命令結果
/d
同時切換磁碟機
/q
Quiet Mode。不會再次詢問是否刪除檔案。
/b
結束目前的batch script而不是cmd.exe。
/b [exitCode]
將ERRORLEVEL variable設為exitCode所設的數字。
/c:string
所要逐字搜尋的字串。若要搜尋多個字串,可用空白字元分隔。
/r /c:string
將string視為regular expression來使用。
使用for 迴圈iterate 項目
for %%PARAMETER in (ITEM1 ITEM2 ITEM3 ...) do COMMAND
一次讀出字串並將其分成獨立的項目(tokens)
for /f ["OPTIONS"] %%PARAMETER in ("Text string to process") do COMMAND
一次讀出command的輸出並將其分成獨立的項目(tokens)
for /f ["OPTIONS"] %%PARAMETER in ('COMMAND_TO_PROCESS') do COMMAND
使用一段範圍的數字iterate
for /l %%PARAMETER in (start,step,end) do COMMAND
start - 起始數字
step - 迴圈數字所要增加的值,可為負數
end - 結束數字
OPTIONS
判斷檔案存在與否
if [not] exist FILENAME COMMAND if [not] exist FILENAME (COMMAND) else (COMMAND)
判斷文字字串是否相符 if [not] STRING1==STRING2 COMMAND
使用數值進行判斷 if [not] ITEM1 compare-op ITEM2 COMMAND if [not] ITEM1 compare-op ITEM2 (COMMAND) else (COMMAND)
/i
忽略大小寫。
compare-op:
EQU - Equal
NEQ - Not Equal
LSS - Less Than
LEQ - Less Than or Equal
GTR - Greater Than
GEQ - Greater Than or Equal
將變數設為文字字串
set VARIABLE=STRING
將變數設為數學運算後的值
set /a "VARIABLE=expression"
VARIABLE初始化
set /a VARIABLE=HEX_NUMBER or OCT_NUMBER
可將十六進位數字(ex: 0x2F) 或八進位數字(ex: 057) 轉換成十進位數字。
設定或取消延遲變數展開
setlocal {EnableDelayedExpansion | DisableDelayedExpansion}
EnableDelayedExpansion - 延遲變數展開
DisableDelayedExpansion - 取消延遲變數展開
補充說明
延遲變數展開 (EnableDelayedExpansion)
windows-commands
https://ss64.com/nt/
https://en.wikibooks.org/wiki/Windows_Batch_Scripting
參數
%n 還可以使用下列擴充語法,詳細內容可以使用 call /? 來參考:
%~1 - 展開 %1 並移除包圍的引號(")
%~f1 - 展開 %1 為一個完整合格路徑名稱
%~d1 - 只展開 %1 為磁碟機代號
%~p1 - 只展開 %1 為路徑
%~n1 - 只展開 %1 為檔名
%~x1 - 只展開 %1 為副檔名
%~z1 - 顯示 %1 的檔案大小
常見應用
%~dp0batch檔所在的目錄,常與%CD%作為比較,%CD%代表的是當前的工作目錄。
動態變數
都會重新計算一次。
%CD%
展開當前工作目錄的字串。
%RANDOM%
展開一個範圍0到32767間的整數。
%ERRORLEVEL%
展開目前ERRORLEVEL的值。
參考範例
在Batch 中取出字元的ASCII Number
輸出命令重新定向
清除原有內容後再寫入
COMMAND >> FILENAME
在原有內容後寫入
COMMAND < FILENAME
將FILENAME的內容傳入COMMAND
COMMAND_A | COMMAND_B
將COMMAND_A的output傳入COMMAND_B
常見應用
COMMAND > nul不印出輸出命令結果
cd
/d
同時切換磁碟機
del
/q
Quiet Mode。不會再次詢問是否刪除檔案。
endlocal
exit
/b
結束目前的batch script而不是cmd.exe。
/b [exitCode]
將ERRORLEVEL variable設為exitCode所設的數字。
findstr
/c:string
所要逐字搜尋的字串。若要搜尋多個字串,可用空白字元分隔。
/r /c:string
將string視為regular expression來使用。
for 迴圈
使用for 迴圈iterate 項目
for %%PARAMETER in (ITEM1 ITEM2 ITEM3 ...) do COMMAND
一次讀出字串並將其分成獨立的項目(tokens)
for /f ["OPTIONS"] %%PARAMETER in ("Text string to process") do COMMAND
一次讀出command的輸出並將其分成獨立的項目(tokens)
for /f ["OPTIONS"] %%PARAMETER in ('COMMAND_TO_PROCESS') do COMMAND
使用一段範圍的數字iterate
for /l %%PARAMETER in (start,step,end) do COMMAND
start - 起始數字
step - 迴圈數字所要增加的值,可為負數
end - 結束數字
OPTIONS
| Key   | Description   |
| delims=xxx   | 設定分隔字元(預設為空白字元),xxx表示可設定多個字元。   |
| token=x,y   token=z*   token=m-n   |
用來決定要取出的item,並且放到parameter中。  若token=x,就取出第x項item。   token=x,y,若parameter設為%a,便取出第x與y項item分別置於%a和%b自動變數中。  token=z*,若parameter設為%a,取出第z項置於%a中,並將第z項後的所有item置於%b中。  若token=m-n,便取出第m至第n項。  |
if 判斷式
判斷檔案存在與否
if [not] exist FILENAME COMMAND if [not] exist FILENAME (COMMAND) else (COMMAND)
判斷文字字串是否相符 if [not] STRING1==STRING2 COMMAND
使用數值進行判斷 if [not] ITEM1 compare-op ITEM2 COMMAND if [not] ITEM1 compare-op ITEM2 (COMMAND) else (COMMAND)
/i
忽略大小寫。
compare-op:
EQU - Equal
NEQ - Not Equal
LSS - Less Than
LEQ - Less Than or Equal
GTR - Greater Than
GEQ - Greater Than or Equal
set
將變數設為文字字串
set VARIABLE=STRING
將變數設為數學運算後的值
set /a "VARIABLE=expression"
常見應用
set VARIABLE=VARIABLE初始化
set /a VARIABLE=HEX_NUMBER or OCT_NUMBER
可將十六進位數字(ex: 0x2F) 或八進位數字(ex: 057) 轉換成十進位數字。
setlocal
設定或取消延遲變數展開
setlocal {EnableDelayedExpansion | DisableDelayedExpansion}
EnableDelayedExpansion - 延遲變數展開
DisableDelayedExpansion - 取消延遲變數展開
補充說明
延遲變數展開 (EnableDelayedExpansion)
2018年6月5日 星期二
Docker 命令列介面筆記
本篇文章參考來源:
https://docs.docker.com/get-started/part2/
https://docs.docker.com/engine/reference/commandline/docker/
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
取得 python的image
取得 python版本為3.8.16的image
docker build [OPTIONS] PATH | URL | -
OPTIONS
docker image COMMAND
列出image
OPTIONS
刪除 image
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS
python的交互模式在 container中執行
docker container COMMAND
列出container
OPTIONS
docker container stop [OPTIONS] CONTAINER [CONTAINER...]
終止執行中的container
https://docs.docker.com/get-started/part2/
https://docs.docker.com/engine/reference/commandline/docker/
-
docker pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull python
取得 python的image
docker pull python:3.8.16
取得 python版本為3.8.16的image
-
docker build
docker build [OPTIONS] PATH | URL | -
OPTIONS
| Name, shorhand   | Description   |
| --tag, -t   | 指定image的命名及tag,格式為name:tag,tag為optional   |
-
docker image
docker image COMMAND
docker image ls
列出image
OPTIONS
| Command   | Description   |
| --all, -a   | 列出所有images   |
docker image rm
刪除 image
-
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS
| Name, shorhand   | Description   |
| --detach, -d   | 讓container在背景執行   |
| --interactive, -i   | 保持 container中的 STDIN開啟   |
| --publish, -p   | 將container的port映射到host端   |
| --rm   | 在container exit後自動移除   |
| --tty, -t   | 分配一個 pseudo-TTY給 container   |
docker run --rm -i -t python:3.8.16
python的交互模式在 container中執行
-
docker container
docker container COMMAND
docker container ls
列出container
OPTIONS
| Command   | Description   |
| --all, -a   | 列出所有container   |
docker container stop
docker container stop [OPTIONS] CONTAINER [CONTAINER...]
終止執行中的container
Labels:
Docker
訂閱:
文章 (Atom)