2017年6月4日 星期日

批次檔 bat 如何輸出當前目錄檔案名稱到文件.txt 內

批次檔 bat 如何輸出當前目錄檔案名稱到文件.txt 內

使用 dir
dir /b /on >list.txt
如果有日文會亂碼,加一些指令使用UTF-8存檔
cmd /u /c dir /b /on >list.txt
這樣輸出是正常的,不過文字文件沒辦法直接正常讀,需要其他軟件來開啟。如 sublime text 或是notepad。
再來是讀取檔案使用for迴圈一行一行讀出來
%echo off 
for /f "tokens=*" %%i in (list.txt) do ( 
    echo %%a 
)
其中 “tokens=*” 是關鍵如果讀取的文字檔中有空白,不加會讀不到
詳細可以參考:Re: [問題] bat檔判斷ini內容
最悲劇的是…剛剛的使用UTF-8存檔導致bat無法讀取,貌似沒救了。
還是不能操作日文檔名
WTF,完全生手,花了幾小時結果是死路QuQ

powershell

後來又花了幾小時改用 powershell 這個真的有點神
先創一個讀檔的
Function Read_File($ex_name){
    $file=Get-ChildItem -Recurse -ErrorAction SilentlyContinue -Filter *$ex_name | 
    Where-Object { $_.Extension -eq $ex_name }
    return $file
}
然後直接使用
$file=Read_File '.jpg'
印出就直接打就好了
$file
印出來會一團東西加個
$file.Name           # 保留檔名
$file.BaseName   # 去除附檔名
他會特麼很神的直接變成陣列
$file.Name          # 印出全部
$file.Name [0]     # 印出第一個
$file.Name [-1]   # 印出最後一個
怎麼這麼神奇,果斷放棄bat QuQ
接下來for迴圈可以上場了,一個一個處理
# 複製至資料夾內
ForEach($item in $file){
    mkdir $item.BaseName -ErrorAction SilentlyContinue
    Copy-Item $item.Name $item.BaseName
    # Remove-Item $item.Name
}
$item就是當前檔案名稱了,他會挨個輪過一次,這裡我是要把它放入資夾內。
比如說有個檔案是 123.jpg 我要放到 123/123.jpg 內。


其他參數

回頭來說一下剛剛一團函式
Get-ChildItem
印出當前目錄檔案
Recurse
這個貌似是讀子目路
-ErrorAction
略過警告比如說移動檔案時問你要不要覆蓋,SilentlyContinue是他的附帶參數(安靜的繼續)
-Filter *$ex_name
第一階段過濾出擴展名(副檔名),不過能力有限,假設過濾圖檔.jpg.jpg這樣會一起進來
Where-Object { $_.Extension -eq $ex_name }
補足上一個問題 $_ 指的是當前的緩存物件,這裡有指名(給名字)是$file


輸出到文本

兩行就可以解決了,如果要寫成一行中間加個分號隔開即可,後面選定Unicode才可以支持中文、日文、韓文等等會出狀況的文字。
$file=Get-ChildItem
set-content $file -path list.txt -Encoding Unicode
如果是要在CMD環境下使用可以使用(不過前提是系統支援)
powershell $file=Get-ChildItem; set-content $file -path list.txt -Encoding Unicode
如果想換個位置的話,比如說我目前在使用者目錄,但工作目錄不想cd切過去桌面(這裡輸入的目錄也可以改成絕位置)
$file=Get-ChildItem -path Desktop
set-content $file -path Desktop/list.txt -Encoding Unicode

查找函式

要查找函式可以透過這樣的方式知道有哪些方法可以用
Get-ChildItem $FilenNme | format-list *
另外獲取目錄後來發現一個比較簡單的用法
$file=Get-ChildItem -Recurse -include "*.jpg"

沒有留言:

張貼留言