用於命令提示的名稱排序



贊助商連結


琥珀
2010-07-22, 05:12 PM
自 Windows XP 開始,引進了新的名稱排序法,不過並非所有介面都適用。最明顯的例子,命令提示字元 (cmd),就是屬於典型的機械式排序,不會受到 Windows Explorer 新的名稱排序法所影響。

七位數的修補程式今年終於來臨,不過對於批次處理來說,算是一種困擾。雖然名稱不見得重要,不過能依照人們希望的解釋去排序,總是比傳統排序好。

以下這個範例,是機械式排序:

1.txt
10.txt
100.txt
101.txt
...
109.txt
11.txt
110.txt
111.txt
12.txt
13.txt
...
19.txt
2.txt
20.txt
21.txt
...
29.txt
3.txt
30.txt
31.txt
...
...
89.txt
9.txt
90.txt
91.txt
...
99.txt

機械式排序和人性化排序都有各自的特點。意思並不代表,人性化排序就一定會優於機械式排序,而是能符合當下期望的結果,就是好排序,反之則是不好的排序。就使用趨勢來說,不可否認的,人性化排序是新一代的標準,去除了機械式排序的問題,更能符合多數用戶的實際需要。

想到這裡,問題自然就來了。如果命令提示字元不支援人性化排序,對於上面提到的「七位數問題」,就只好更改檔案名稱,以便符合機械式排序要求。如果想要人性化排序,琥珀原先的想法是,先建構一個自在式,解決排序的問題,不過這想法還是放棄了。

贊助商連結


bx2aa
2010-07-22, 06:55 PM
「七位數問題」
三位數七個字, 還是七位數不包含副檔名?

整理一下

mkdir test

cd test

for /L %i in (1,1,100) do echo.> %i.txt
或用 UnxUtils 的 touch ===> for /L %i in (1,1,100) do touch %i.txt

dir /b > test.txt

方法1:
type test.txt | grep -v "....txt" | grep -v "...txt" >test1.txt

type test.txt | grep -v "....txt" | grep -v "^..txt" >>test1.txt

type test.txt | grep "....txt" >>test1.txt

type test1.txt

方法2:
for /L %i in (1,1,9) do ren %i.txt 00%i.txt
for /L %i in (10,1,99) do ren %i.txt 0%i.txt
dir /b

琥珀
2010-07-23, 12:23 AM
琥珀知道,利用這些命令,最後一定有辦法做到特定樣式,不過就因為如此,才氣也有可能會變成毒藥。如果是簡單的排序樣式,寫個幾行命令就能完成,但考量到真實環境上的應用,還是要靠作業系統的原始支援。

Windows 系統的「依名稱排序」,許多用戶大概都了解,排序會隨著系統區域設定或使用者區域設定,呈現截然不同的樣貌。簡單來說,就是不同語言的排序方式,或是所謂的語言優先順序,想要完全用命令行來實現,有相當的困難度,因為許多程式根本就過不了這一關,光是處理統一碼的問題,就會有「放棄批次命令」這樣的想法。