顯示具有 命令提示字元 標籤的文章。 顯示所有文章
顯示具有 命令提示字元 標籤的文章。 顯示所有文章

使用 YouTube 的神器

youtube-dl:
用 Python 寫的下載器,在很多作業系統都可以使用。以下是常用到的參數:

  • -U, --update
  • 它會自動更新,但要注意如果是用套件安裝的話不要這樣更新。
  • --playlist-end NUMBER
  • 只分析從現在往前算幾個使用者或頻道所上傳的影片。
  • --match-title REGEX
  • 用正規表示法選擇要處理的影片;但個人不建議,先全部下載再分析比較好。
  • --dateafter YYYYMMDD
  • 某時間點之後的影片。
  • --download-archive FILE
  • 用一個 FILE 紀錄之前處理過哪些影片,下一次就不會重複處理。
  • -o, --output TEMPLATE
  • 輸出檔名,預設是 '%(title)s-%(id)s.%(ext)s',建議用 '%(title)s.%(ext)s'。
  • --restrict-filenames
  • 用不會出現亂碼的字,Windows 下有機率會用到。Linux 下只要在 /etc/locale.conf 設定 LC_ALL 是某個 UTF8 就不需要這個參數了。
  • --skip-download
  • 所有事情都會做,除了下載。
  • -f, --format FORMAT
  • 畫質,詳見維基百科。也可疊加,如 bestvideo+bestaudio 但要配合 FFmpeg 使用。
  • -F, --list-formats
  • 看 YouTube 有提供的畫質。

其他指令請自行去看 --help 推敲,因為上面這些就很夠用了。



youtube-upload:
在 Linux 下的程式,以下是常用到的參數:

  • --email=
  • --password=
  • --title=""
  • --description=""
  • 不用解釋。
  • --category=
  • 可以用 --get-categories 看。
  • --keywords=""
  • 逗號分隔。
  • --private
  • --unlisted
  • 任君選擇。

上傳 15 分要先手機認證,認證後還是超過的電視影片隔一段時間還是會先將影片設成私人,需要手動去解開。



kej.tw/flvretriever:
很陽春麻煩的網頁下載方式,但好處是永遠不會失效,出外只有瀏覽器時很好用。



以下是寫給酷看的: YouTube 大量批次下載、大量批次上傳、臨時行動可攜(Portable)下載方法。

命令提示字元 00:教學目錄

網路上對於命令提示字元得出學者教學根本找不到,但這是所有想要深入電腦領域的必備知識,因此在這裡野人獻曝一番。本教學針對 Microsoft© Windows® 10 所寫的教學,版本是 1703。

在閱讀時有任何問題歡迎在下面直接留言,也歡迎老手來指教,就直接點下面的連結開始吧!

  1. 基本常識
  2. 熟悉環境
  3. 入門指令
  4. 小試身手
  5. 基本指令
  6. 承先啟後
  7. 符號總輯
  8. 進階指令
  9. 條件判斷
  10. 變數指令
  11. 目錄變數
  12. 檔案複製
  13. 撰批次檔
  14. 淺入淺出
  15. 外掛加持
  16. 文字文件
  17. 變數變換
  18. 迴圈入門
  19. 迴圈進階
  20. 說文解字
  1. 鵬程萬里




以下是給酷狗看的:本篇是命令提示字元的教學,採用 Microsoft© Windows® 10, Version 1703 繁體中文(zh-TW, Traditional Chinese)作業系統,即 cmd 或 command。

命令提示字元 99:鵬程萬里

寫了這個標題也挻好笑的,但也想不出其他的,因為有了命令提示字元的基礎後就可以深造:

  • PowerShell
  • 微軟© 所提供進階使用的命令列工具,其實 PowerShell 才夠用。

  • 終端機
  • 終端機是 Linux-based 在使用的命令列工具,詳細教學鳥哥全部都有,有興趣的可以去買他的書。

其實在寫這篇教的時候原本打算只寫十章左右,但後來發現很多還是要提,所以加到二十章。這篇教學花了大概二個多月寫,寫起來還算順手,畢竟也用了一、二年了。在這裡要補足一下 Linux 終端機跟微軟© 命令提示字元的差異,因為很多東西不一樣:
  • 作業系統
  • 建議使用 Ubuntu 。

  • 檔案架構
  • 沒有 C:\ 這種東西了,取而代之的是 / ,下面有 /etc, /usr, /mnt, /boot, /home 等等,可以把任一個指定資料夾分到任一磁碟分割區,如 / 分到第一個分割區, /home 分到第二個分割區,這樣下次重灌不用再備份資料。

  • 權限
  • Linux 的權限是很複雜的,由其多了一個「執行」權限,即要有可執行權限才可執行程式。

  • 正規表示法
  • 用來處理字串的方法,幾乎可以處理大部份的問題,但要學也真的不好學。

  • 指令查詢
  • 除了 /? 、-h 、--help 的方法, Linux 還多了 man 的指令,如可用 man echo 查詢 echo 的用法。

  • 文字編輯
  • 內建命令列的文字編輯器 vi 雖然要背很多指令但很重要,要熟悉。

命令提示字元 16:文字文件

這章是要討論文字編碼及命令提示字元對於 Unicode 的支援。首先先來看最單純的:

ASCII

這是美國國家標準協會(ANSI)所制定的文字編碼方法,一共 128 個字,詳見維基百科



但 128 個實在沒有全球通用,所以國際標準化組織(ISO)就定義通用字符集 ISO 10646(Universal Character Set,UCS)來統一所有字集,經由統一碼聯盟(主要是一些企業)整理誕生了:

Unicode

有鑑於 ASCII 一個位元組(1 byte)不夠用,所以 Unicode 就用二個位元組(2 byte)來表示一個字,可達 65536 個字。對應字元的動作是「轉換格式」(Unicode Transformation Format,簡稱為 UTF),而二個位元組 Unicode 實作是:

UTF-16

這是 Unicode 的標準的名稱,在 ISO 的標準叫作 UCS-2 。另外 ISO 也定義了四個位元組,其 Unicode 實作是:

UTF-32

這是 Unicode 的標準的名稱,在 ISO 的標準叫作 UCS-4 。但實際上沒有那麼簡單,在麥金塔和個人電腦上讀取字元順序不同,如「U+4E59」,在個人電腦(像是 Windows)會取「4E59」的「乙」字;但麥金塔會取「594E」的「奎」字。為了區分,前者叫作大端序:

UTF-16 Big Endian (UCS-2 BE)
UTF-32 Big Endian (UCS-4 BE)

後者叫作小端序:

UTF-16 Little Endian (UCS-2 LE)
UTF-32 Little Endian (UCS-4 LE)

為了區別二者,編碼時會在文件第一個字加入位元組順序記號(Byte-Order Mark,BOM),第一個字是 U+FFFE 表示小端序;第一個字是 U+FEFF 表示大端序。



但原本 UTF-16 實在太粍空間了,原 ASCII 字集竟然要用二個位元組(2 byte),所以 Unicode 就創造了只用一個位元組(1 byte)存放的方法:

UTF-8

就是把 ASCII 字集第一位元(bit)置「0」以作識別,而其他字就是 UTF-16 字集。 UTF-8 因為編碼過所以不用考慮位元組序(因為很好辨識),但是微軟視窗作業系統的記事本就在所有文字文件檔(.txt)前面加上 0xEFBBBF 這個字來表示這是 UTF-8 ,但在大部份不支援的軟體(尤其是編譯器)會有問題,所以才會有另外一種文字文件產生:

UTF-8 without BOM

非常之好笑的是命令提示字元是不吃 BOM 的,當它被餵 BOM 時它會認為前面多一個字。



講那麼多是要接接下來的解釋,在前面也看到大部份的字元都要用到 Unicode ,當然在批次檔也有可能會用到,不過很可惜,命令提示字元支援得很差,啟用方法有二種,第一種是:

cmd /u

而第二種方法是:

chcp 65001

從 Windows® 10 中命令提示字元己經可以做一些 Unicode 的操作,這是相較之前幾版非常大的改進。連 .cmd 存成 Unicode 也是可以正常支援,這在以往是不行的。讀者可以嘗試對 Unicode 字元顯示,應該不會有什麼問題。但是 Unicode 字元眾多,使用時還是要再三確認執行是否正常,以免日後的批次檔出問題。

命令提示字元對 Unicode 支援進行大幅的改善,謝天謝地,這在之前是連想都不用想。字元編碼的部份也多少會一下,本教學已經整理得很精簡了,以後在使用上也不會有問題。下一章也跟這章性質很接近,會用到但不重要。



下一章:變數變換




  • 2012-09-11 初次發佈。
  • 2013-07-20 部分字句修改。
  • 2017-07-12 更新成 Windows 10 的版本。

命令提示字元 20:說文解字

這一章是來寫為何要寫整篇教學,就是要來寫「for」的說明到底在寫什麼東西。

for

首先,先來看看功用:

對一組檔案中的每個檔案執行指定的命令。

看完就引人發笑,看起來好像有說什麼,實際上又好像沒有。而且,「對一組檔案」根本是錯的。反正不可能用一句話完全解釋,就寫個「迴圈處理」就好了嘛。

FOR %variable IN (set) DO 命令 [command-parameters]

  %variable  指定一個可以取代的參數。
  (set)      指定由一或多個檔案組成的檔案組。您可使用通配字元。
  command    指定命令來執行每一個檔案。
  command-parameters
             為所指定的命令指定變數或參數。

如果要在批次程式中使用 FOR 命令,請指定 %%variable,而不要指定
%variable。變數名稱有大小寫的區分,所以 %i 不同於 %I。

這邊有很多地方寫得很引人模糊:
  1. 括弧裡面用「set」不懂的人會誤為是「set」指令。
  2. 「DO 命令」的「命令」就翻譯,那後面「[command-parameters]」為何不翻?下面「command」為何不翻?
  3. 注意喔,這邊是用「通配字元」。
  4. 「指定命令來執行每一個檔案」跟上面犯了同一個錯誤。
  5. 注意喔,這邊是用「參數」。
  6. 自行任意斷行,明明可以一行結束,或者是句號成一行,這樣看起來很痛苦。
繼續下去:

如果您啟用擴充命令,則額外支援下列的 FOR 命令格式:

這邊用「擴充命令」,天曉得它在說什麼?其實就是「參數」啦!後面「額外支援」也不知道額外支援什麼。

FOR /D %variable IN (set) DO command  [command-parameters]

    如果 set 中包含萬用字元,則指定與目錄名稱相符,
    而不是與檔案名稱相符。

這邊又用「萬用字元」,上面是「通配字元」。「則指定與目錄名稱相符,而不是與檔案名稱相符」它是說它會只丟執行目錄下的所有目錄,果然是天書。

FOR /R [[drive:]path] %variable IN (set) DO command  [command-parameters]

    在樹狀目錄中切換 [drive:] 路徑,並於樹狀目錄的每
    一個目錄下執行 FOR 陳述式。如果未在 /R 之後指定
    目錄規格,則採用目前的目錄。如果 set 只是單一句
    點 (.) 字元,則它只會列舉樹狀目錄。

「在樹狀目錄中切換」也是很奇怪的文句,「遞迴傳回」不就好了。「目錄規格」是?「採用目前的目錄」是?「則它只會列舉樹狀目錄」是指說它不會丟檔案,它指會丟底下所有目錄進去。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    set 是從開頭到結尾一次跳一步的連續數字。所以
    (1,1,5) 會產生連續值 (1 2 3 4 5) 而 (5,-1,1)
    會產生連續值 (5 4 3 2 1)

「從開頭到結尾一次跳一步的連續數字」天啊!這是哪一國的語言啊?

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    或,如果使用 usebackq 選項:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

中間的「file-set」「string」「command」應該要翻譯,因為是要取代掉的字。可以看到的是他這邊又改成「選項」了,上面出現過「參數」、「擴充命令」。

    file-set 可以是一或多個檔案名稱。繼續進行 file-set 中的下個
    檔案之前,都已開啟、讀取及處理過每個檔案。處理程序包括讀取
    檔案、將它分割成獨立的文字行,然後將每一行剖析成零或多個語
    法。使用已設成找到之語法字串的變數值,呼叫 For 迴圈的內容。
    依照預設,/F 會從每個檔案的每一行傳送第一個以空格分隔的權
    杖。空白行會被略過。您可以指定選擇性的 "options" 參數來覆寫
    預設的剖析行為。這是有引號的字串,包含一或多個指定不同剖析
    選項的關鍵字。

前面四行看要有耐心,它是在說「for」的運作過程。「空格分隔的權杖」,來看看教育部對於「權杖」的解釋:「象徵某種權力的手杖」,也許個人國語不好,對不起。現在又用「參數」,接下來「剖析」本來就很奇怪,加上「行為」更可顯其冗。

    關鍵字是:

        eol=c           - 指定一個行尾註解字元 (只有一個)
        skip=n          - 指定在檔案開頭要略過的行數。
        delims=xxx      - 指定分隔符號集。這會取代預設的空格
                          與定位字元的分隔符號集。
        tokens=x,y,m-n  - 指定每一行的哪些語法應該被傳到 for
                          的內部以進行每一個重複操作。這會造
                          成配置額外的變數名稱。m-n 格式代表
                          一個範圍,指定了第 m 個到第 n 個權
                          杖。如果 tokens= 字串的最後一個字
                          元是星號,則會配置一個額外的變數並
                          在最後一個語法被剖析後接收該行中的
                          其他文字。
        usebackq        - 指定新語義開始作用。其中反括號的字
                          串會被當作命令來執行,而單引號字串
                          是純文字字串命令,並且允許使用雙引
                          號來引用 file-set 中的檔名。

是我理解錯誤嗎?「eol」應該是用在行首啊!「tokens」更是文謅謅到極致,「指定新語義開始作用」更是無法理解。

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    這會剖析 myfile.txt 檔案中的每一行,它不會去管以分號開頭的行數
    ,直接將第 2 個及第 3 個語法從每一行傳到 for 主體,而其語法是
    用逗號和/或空格分開的。請注意,for 主體陳述式參照 %i 以取得第
    二個語法,參照 %j 以取得第三個語法,使用 %k 取得第三個語法之
    後的剩餘字串。因為檔案名稱含有空格,您必須用雙引號來括住檔案名
    稱。要這樣使用雙引號,您必須使用 usebackq 參數。否則雙引號會被
    解譯成用來定義一般文字。

「行數」「語法」都是亂翻,「主體」跟之前的「陳述式」不同,「用逗號和/或空格」邏輯跟本是錯的,「或」就夠了。又來了一個「參照」,而且「因為檔案名稱含有空格」在「myfile.txt」的哪裡?

    使用 %i 明白地在 for 陳述式中宣告,並透過 tokens= option 使用
    %j 作暗示性的宣告。您可以藉由 tokens= line 來指定最多 26 個語
    法,前提是它宣告的變數不能高於字母 'z' 或 'Z'。請記住,FOR 變
    數是單一字元的,同時在任一時間內,您不能同時使用超過 52 個 FOR
    變數。

「暗示性」是說它會把剩的丟到「%j」、「%k」等等。「不能高於字母 'z'」有什麼字母比 'z' 還高?「同時在任一時間內」,這是指現在、過去、還是未來?

    您也可以使用 FOR /F 命令在立即字串中剖析邏輯,方法是將括弧之間的
    file-set 變成一個引號字串。它會被視為從檔案輸入的單行,並加
    以剖析。

    最後,您可以使用 FOR /F 命令來剖析一個命令的輸出。方法是將括弧
    內的 file-set 變成單引號字串。它將被視為一個命令列,這個命令
    行將會傳到子 CMD.EXE,而輸出將會被擷取到記憶體中,當成檔案來分
    析。所以下列的範例:

        FOR /F "delims==" %i IN ('set') DO @echo %i

    將列舉目前環境中的環境變數名稱。

第一段就是「FOR /F 也可以用來剖析字串。」,第二段就是「FOR /F 也可以用來剖析其他程式的輸出。」

此外,已經加強了 FOR 變數參考的取代功能。
您現在可以選用下列選擇性的語法:

    %~I         - 展開 %I 且移除包圍的引號 (")
    %~fI        - 展開 %I 為一個完整合格路徑名稱
    %~dI        - 只展開 %I 為磁碟機代號
    %~pI        - 只展開 %I 為路徑
    %~nI        - 只展開 %I 為檔名
    %~xI        - 只展開 %I 為副檔名
    %~sI        - 展開的路徑只包含短檔名
    %~aI        - 展開 %I 為檔案的檔案屬性
    %~tI        - 展開 %I 為檔案的日期/時間
    %~zI        - 展開 %I 檔案的長度
    %~$PATH:I   - 搜尋所有列在 PATH 環境變數內的目錄且展開 %I
                  為第一個找到的完全符合檔名。如果沒有定義環境
                  變數名稱或是搜尋找不到檔案,則這個修飾元會展
                  開為空字串。

「此外,已經加強了」誰?「變數參考」是?「您現在可以」從?「選擇性的語法」是?「完整合格路徑名稱」是?「短檔名」是?「修飾元」是?

修飾元可以合併使用以獲得綜合的結果:

    %~dpI       - 只展開 %I 為磁碟機代號與路徑
    %~nxI       - 只展開 %I 為檔名與副檔名
    %~fsI       - 只展開 %I 為含短檔名的完全路徑
    %~dp$PATH:I - 為 %I 搜尋所有列在 PATH 環境變數內的目錄
                  且展開第一個找到的項目為磁碟機代號及路徑。
    %~ftzaI     - 展開 %I 為像 DIR 一樣的輸出行

這段看起來還可以看。

在上面的範例中 %I 和 PATH 能用其他的合法值取代。%~ 語法是由合法的
FOR 變數名稱來終止。如果選用像 %I 的大寫名稱可以增加可讀性而且避免
和修飾元的混淆,因為這些並不區分大小寫。

前面是在說所有 set 變數可以類似「%~$PATH:I」用法。中間是說以「%~」開頭的要以有宣告在「for」的變數作結尾(癈話)。後面是說大寫比較好,不容易搞混。



說完了,整篇教學也完了。其他像「set」「if」的說明也很經點,值得去看看。下一章有結語,有興趣的可以去看看。



下一章:鵬程萬里




  • 2012-09-11 初次發佈。

命令提示字元 19:迴圈進階

「/f」到底有什麼魅力呢?他功能多到必須要先解釋。首先,括弧裡面可用三種模式:

(檔案)
("字串")
('指令')

這樣沒有人看得懂,所以範例:

for /f %i in (Test.txt) do echo %i

因為預設是以空白(Space)或跳位(Tab)做切割,所以不是整行讀取。

for /f %i in ("This is a test.") do echo %i

也是以空白做分隔。

for /f %i in ('dir /b') do echo %i

這樣就可以知道「/f」的魅力了吧?



在前面參數可以自訂以取得想要的結果,用以下文字文件來解釋:


第一個「delims」:

for /f "delims=]" %i in (Test.txt) do echo %i

就是指定字元去分割字串,當然「]」不存在,所以整句會直接上去,預設是空白(Space)或跳位(Tab)。而下面這樣會比較好懂:

for /f "delims=a" %i in (Test.txt) do echo %i

二個字也行喔:

for /f "delims=ai" %i in (Test.txt) do echo %i

接下來是「skip」:

for /f "skip=1" %i in (Test.txt) do echo %i

就是第一行不要處理啦!下一個是「eol」:

for /f "eol=$" %i in (Test.txt) do echo %i

就是前面有符號「$」不要處理啦!下一個「tokens」比較複雜:

for /f "tokens=1,2,3" %i in (Test.txt) do echo %i %j %k

他是說,把字串以空白切出來,所以「This is a test.」會被切成「This」「is」「a」「test.」,而取其中第 1, 2, 3 段分別丟到 %i, %j, %k 中。這是「tokens」特殊用法,被切出來的會依序從原指令 in 前面的 %i 開始丟。下面這樣也可以:

for /f "tokens=1,2,3" %i in (Test.txt) do echo %i %j %k

用連字號也沒有問題。最後一個是沒有用過的「usebackq」:

for /f "usebackq" %i in ("Test.txt") do echo %i

是指原本用來表示「(檔案)」改成「("檔案")」、「("字串")」改成「('字串')」、「('指令')」改成「(`指令`)」。應該是為了要避免跳脫字元的關係,但個人沒有過的原因那就直接用跳脫字元就好了啊!補充一下:

for /f "eol=$ skip=1 tokens=1-4 delims=a" %i in ("Test.txt") do echo %k

參數是可以混搭的,要注意「delims」有可能需要用空白,所以建議擺在最後一個,避免判斷錯誤。



「for /f」實在是一個很實用的指令,但也是整個教學裡面最難學的。不過學完這個應該也會覺得還好,命令提示字元也不過爾爾,沒錯!的確沒有很難。下一章沒有新知識了,博君一笑罷了。



下一章:說文解字




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。

命令提示字元 18:迴圈入門

最後的最後,終於到這個最難的這個:

for

應該不會再被這麼長的說嚇到了吧?「for」重要到一定作用的批次檔一定會有它的存在,它的功用多到只能理解,不能用一二句說明結束。一開始要先說明基本結構:

for %i in (a b c) do echo %i

上面用中文解釋是:

「把括弧裡面的『a』、『b』、『c』分別用『%i』丟到後面的指令去執行。」

其中有很多細節要說:
  1. 所有單字的順序不能任意變換,如「%i」要在「in」之前等等。
  2. 在「for」中的變數只有前面一個百分比「%」,跟一般變數不同。
  3. 變數可以用「%A」到「%z」共五十二個,夠用了。
  4. 中間的括弧不能省略。
  5. 存成批次檔時變數要用二個百分比,「%i」要改「%%i」。
上面的每點都很重要,尤其最後一點很容易被忽略。平常都是用「%i」開始比較多,括弧也很常見:

for %i in (a b c) do (
echo %i
)

當然,不使用變數「%i」在後面括弧指令中也沒有問題。



參數「/l」可用來建立一個數列:

for /l %i in (1,1,2) do echo %i

從 1 開始,每次加 1 ,一直加到 2 ,並且丟到後面去執行。



「for」可以做成巢狀,範例如下:

for %i in (a) do for %j in (b) do echo %i%j

不難理解。



中間有二個參數「/d」「/r」跳過了,因為全部可以用「/f」取代,因為比較好記,可以變化的也比較多。這章的迴圈威力還沒有出來,因為要作基本的介紹;下一章就可以說是這整個教學的核心了,不是那麼好理解,但卻是大多數批次檔都會出現的指令。



下一章:迴圈進階




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。

命令提示字元 17:變數變換

這章是在說如果要變數(或字串)中的某一部份要怎麼頡取,其實常用的只有一個:

%~ni

就是只顯示這個字串的路徑與檔名。



好了,這章說完了,下一章。



不可以這樣啦,所以來濫竽充數:

%~i TestTestTest.cmd
%~ai --a------
%~di C:
%~fi C:\Test\TestTestTest.cmd
%~ni TestTestTest.cmd
%~pi \Test\
%~si C:\Test\TESTTE~1.CMD
%~ti 0000/00/00 00:00
%~xi .cmd
%~zi 0

沒有辦法全部解釋,所以有需要的人可以去看 for 的說明。另外上面可以合併多個使用。



接下來補充字串取代,使用方法是用變數「%變數名稱:舊字串=新字串%」,實際如下:

set "Test=Test to test."
echo %Test: =_%

完整使用 http://ss64.com 有說明。



這章真的沒了。其實在 Linux-based 有正規表示法可以用,比這種孱弱的指令強大多了,有一些比較複雜的字序變換還要使用「for」才可以達成,這也是這篇隨便寫的原因,因正規表示法才是應該花心思去研究的。什麼?「for」沒有教?下一章啊!



下一章:迴圈入門




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。

命令提示字元 15:外掛加持

這章是來介紹一些 Windows 沒有的指令,這些指令會用到,但沒有內建。在這裡提供一些指令,事實上不一定只能用這些,僅供參考。



「FFmpeg」的指令說明沒有辦法、也沒有意義貼,所以在這裡省略。而這麼長的說明沒有辦法直接看,要用標準輸出來看,有點痛苦。而真的拿來看會昏倒,因為它不是寫給初學者看的,初學者看只會更痛苦而己。所以直接來範例:

ffmpeg -i input.mpg -vcodec libx264 -acodec libvo_aacenc ouput.mp4

好啦,其實個人有寫 FFmpeg 寫一個解說,詳情請看這裡



接下來來說這個,批次檔很容易會用到壓縮或解壓縮,最著名就是用 7-Zip:

7za

現在可以直接使用整合版的 7za.exe 可用,它會自動判斷 32 或 64 位元執行。下載請去 http://www.developershome.com/7-zip/ 看,Igor Pavlov 把它放在一起供大眾下載。詳細用法還是請去看 7-Zip.chm ,在這裡提供一些簡單使用:

7z a Archive.7z .\

以上是新增一個壓縮檔,而要解壓縮的話:

7za x Archive.7z -o.\

請注意參數「e」和「x」的差別。7-zip 的說明簡單易懂,可以全部看看。



批次檔很有機率會下載檔案,很意外的 Windows 沒有提供任何的方式下載,最好的解法是用 Linux-based 的 wget.exe:

wget

wGet 是 Linux-based 內建指令,因為 Windows 沒有提供而 Bart Puype 把它編譯成 Windows 版,可以去 https://eternallybored.org/misc/wget/ 下載。 wget 沒有神奇用法,很單純:

wget http://Google.com -Oindex.html

就這樣。



最後一個是 Nircmd.exe ,因為很多功能 Windows 內建都沒有,所以必須要用 Nir Sofer 提供的 Nircmd.exe 來完成,程式可以去 http://www.nirsoft.net/utils/nircmd.html 下載。

nircmd

實作全部在官網,這裡就不示範了。



這些指令是補足內建指令的不足,實作上要記得放上原執行檔才可執行,由其到新的電腦更是要注意這點。另外這些指令也可以丟到一個資料夾中設成 %path% ,省去執行的麻煩。不過要注意這些指令有可能會有預想不到的變動,即新版可以某些參數不見了等等。下二章來說明一些不是初學者一定要會的事,但知道一下會比較好。



下一章:文字文件




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。

命令提示字元 14:淺入淺出

這章來說這個,其實很晚才說這個很好笑,但沒有辦法:

cmd

這個指令是在 %windir%\system32 底下,所以執行都是執行到它。這裡有幾個參數要解釋:

cmd /c
cmd /k

這個指令跟「start」的功用很接近,但「start」功能比較完整,所以還是建議使用「start」。



這裡終於可以解釋這些東西了,在之前的章節有說到有些指令很特殊,如:

cd

因為這些指令不是真的有一個程式可以執行,那是附屬在「cmd.exe」裡面。如「cd」,它要怎麼做一個「.exe」來切換目錄呢?而這些指令因為輸入可以直接被「cmd」判讀,所以可以不用那麼遵守指令和參數的位置,這也是為何這些指令不需要空白的原因。另外,下列的字元需要加上跳脫字元:

&()[]{}^=;!'+,`~

也就是這些字元都是特殊字元,為了避免跟指令或參數搞混,使用時要加上「^」,舉例如下:

echo ^>

如果沒有加上「^」的話,他會視為標準輸出。



介紹完了,這就是「cmd」。因為實務上很少用到,所以不需要全部都解釋。為了不讓後面的章節太少,所以來解釋命令提示字元的視窗:


現在可以直接選取文字:


按「Enter」可以複製;按右鍵就可以直接貼上。從 Windows® 10 開始「快速編輯模式」己經變成預設,設定方式在視窗上右鍵點出內容:


再勾選「快速編輯模式」就可以直接標記、複製、貼上。另外,在「版面配置」的標籤中,在 Windows® 的「螢幕緩衝區大小」預設值己經改成 9091:


「螢幕緩衝區」源自於 DOS ,傳統 DOS 是直接把字丟到螢幕上後就不理結果,所以要有緩衝區來放字。調大一點可以看到之前輸入指令和結果。而上述的調整可以在「預設值」調成預設,不用重開再調一次:





另外實用上也有一些高速技巧,如要打某目錄檔案時可以只打前面幾個字:

cd pro

這時按下「Tab」,在標準美式鍵盤字母區最左排,就可以自動完成:

cd "Program Files"

多按幾次 Tab 也會跳出不同的資料夾。另外當一個程式執行不完時可以先暫停,按「Ctrl+S」:

tree C:\

或是直接結束,按「Ctrl+C」:

tree C:\

指令太長時,也可以用「Ctrl+左右鍵」來跳字:


上下鍵是可以來叫出之前使用過的指令:


常用大概是這幾個。



「cmd」直的很少在批次檔出現,其實在 cmd 中再開一個 cmd (即再執行 cmd),這時可以用 exit 離開,只是也不知道有什麼用,因為批次檔的指令不會傳到裡面的 cmd 。後半部就很重要了,因為實務上很好用,記起來可以省很多時間。下一章來介紹一些 Windows 沒有內建但卻很常的指令。



下一章:外掛加持




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。

命令提示字元 13:撰批次檔

這一章正式來說批次檔,雖然之前幾章有使用到,這章來完整說明。批次檔就是把一次要執行的程式全部弄成一個檔案,再一起執行。要製作一個批次檔可以用記事本編緝好後存成「.cmd」點二下執行,有時後標準輸出成「.cmd」再編緝會比較快(如 dir >Batch.cmd)。

很多人會問批次檔要寫什麼,這裡也不好拿出一個相樣的例子,所以就抱歉不舉例了。



在這一章要說一些撰寫批次檔會遇到的問題。首先,先說批次檔常用的跳行執行:

goto

實際上是這樣用的:

goto next
echo A.
:next
echo B.

這就是「goto」的功用,直接跳到「:」開頭的地方。「goto」在需要編譯的程式是大忌,但在直譯的命令提示字元就很受歡迎,因為命令提示字元是一次解析一行,沒有程式會亂掉的問題。



批次檔也是可以傳遞參數,範例如下:

echo %0 %1 %2

可以看出來參數被傳遞了,「%0」代表批次檔執行的名稱、「%1」代表第一個參數、「%2」代表第二個參數。



來回顧一下在「set」跳過的東西:

set a=1
(
set a=2
echo %a%
)

很多人己經看出問題所在了,照理要顥示「2」,但可以看到結果它會先把括弧裡面的東西全部展開。解決辦法有二種,第一種是上面介紹的「goto」,在括弧裡面直接使用「goto」,強迫跳出副程式。但這是在比較簡單的程式才好用,否則到最後變數會變成什麼也不知道。程式碼更改如下:

set a=1
(
set a=2
goto next
)
:next
echo %a%

第二種是用延遲環境變數展開功能,程式碼更改如下:

setlocal EnableDelayedExpansion
set a=1
(
set a=2
echo %!a!%
)

直到使用時才會展開;第一行「setlocal EnableDelayedExpansion」是去查 ss64.com 才知道要開。其實一開始個人在撰寫時對這個問題困擾很久,直到做這個教學才知道可以這樣用。



後面來說如何使批次檔更美觀,首先:

echo

「echo on」是預設狀態,就是會顥示每一行執行的指令,若要不顥示,可以用「echo off」:

echo off
echo Test.

可是這還有第一行「echo off」啊!所以有一個東西叫「@」,就是不顥示那一行,使用如下:

@echo off
echo Test.




最後來說二個批次檔也會用到的指令:

pushd C:\
popd

它就是用「pushd」存入執行前目錄(範例是 C:\Users\%username%),並切換到「C:\」,當需要時再用「popd」切換回去(範例是 C:\Users\%username%)。

pushd ..
pushd ..
popd
popd

這二個指令是用堆疊的方式,即最後進去的會最先出來。



這章的深度很淺,但不知道有這些方法時在寫批次檔會不知所措,甚至初學者連錯在哪裡都不知道。批次檔很實用,學完之後可以試著來套用在一些比較簡單的使用上;一開始都會有很多問題,可以試著發問,寫多自然就沒有問題了。



下一章:淺入淺出




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。