為什麼這篇PowerShell 批次檔鄉民發文收入到精華區:因為在PowerShell 批次檔這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者Eveismywife (千元的小遊俠)看板Programming標題Re: [問題] 檔名更改...
※ 引述 《ddavid (謊言接線生)》 之銘言:
:
: ※ 引述《JokePtt (思辨成魔)》之銘言:
: : https://i.imgur.com/3r69LqW.jpg
: : 不好意思 又上來叨擾各位
: : 我用軟體把pdf轉jpg 生成了數千個子資料夾
: : (1)我想把檔案全部一次命名 圖中B部分比如是caseABC以下數千個子目錄下的檔案
: : 圖中A部的hottest只是其一子目錄 如當中檔案1.jpg 2.jpg 3.jpg 檔案數不
: 固定
: : 重命名為 子目錄名 + 分隔號 _ + 檔案流水號*2-1
: : 如 hottest_1.jpg hottest_3.jpg hottest_5.jpg...
: : 在B部分的caseABC下所有子目錄檔案皆找各自的子目錄(A部分名)重新命名
: : 該如何用cmd或powershell??
: : (2)我要將F:\Data\Projects\caseABC 數千個子目錄下改好名的各檔案
: : 一起移至與B同階的 子目錄1 以圖例是 F:\Data\Projects\1
: : 又該怎麼下指令?!
: : 當然移完後的動作 我會直接在caseABC上點內容 確認沒有檔案後移除
: : 再把資料夾 1 改名為 caseABC 手動就可以完成
: : 只是前兩點對於數千個生成的資料夾 及裡面總數上萬個檔案
: : 有點不知所措 還請各位賢德不吝賜教 感恩
: 我還是先講一下如果沒有那個流水號*2-1取代問題的話,只靠cmd完成的方法。
: 我cmd沒熟到那個程度,也許有人知道cmd就能搞定完整要求的方式XD
:
: 在caseABC裡面建立個批次檔(就假定是ren_and_move.bat吧),內容為:
:
:
: for /d %%i in (*) do (
: cd %%i
: for %%j in (*) do ren %%j %%i_%%j
: cd ..
: mv %%i F:\Data\Projects\1
: )
:
:
: 第一行跟上一個回答前半很像,但加入 /d 是表示找的不是檔名而是子目錄。
:
: 找到了caseABC下面的一個子目錄名取代後面四行裡面全部的%%i後,第二行進去
: 那個子目錄。
雖然你們好像要cmd。
不知道powershell行不行XD
第一次回別人文,初體驗就給你了XD
如果哪邊違反版規提醒我一下,謝謝。
過年有點無聊 看看PTT還有什麼有趣的板。
剛好翻到這裡,看到這篇文蠻有趣的,想幫忙解決看看。
不過我根本完全不懂bat更別說powershell,但是我對於bash shell略懂略懂。
所以我就依照那邊的知識來寫寫看powershell,XD
題外話: powershell寫起來一點都不power阿(?
我覺得好難寫QAQ
先放程式碼:
$Data_Location = "C:\Data\Projects\"
$move_dir = "C:\Data\1"
#檢查目錄
if (!(Test-Path -Path $move_dir )) {
$wsh = New-Object -ComObject WScript.Shell
$answer = $wsh.Popup("你要移動的目的地不存在,你這87,腳本將結束", 20, "路徑問
題", 32)
exit
}
if (!(Test-Path -Path $Data_Location )) {
$wsh = New-Object -ComObject WScript.Shell
$answer = $wsh.Popup("你的Data目錄不存在,你這87,腳本將結束", 20, "路徑問題",
32)
exit
}
#取得第一層目錄名
$l = Get-ChildItem $Data_Location | ?{$_.psiscontainer -eq $true} | select-objec
t name
foreach ($i in $l){
cd $i.name
#取得第二層目錄名
$f = Get-ChildItem ($Data_Location + $i.name.ToString()) | ?{$_.psiscontaine
r -eq $false} | select-object name
foreach ($j in $f){
$tmp = $j.name.ToString()
$result = ([int]$tmp.SubString(0,$tmp.LastIndexOf('.'))) * 2 - 1
$result = ([String]$result) + ".jpg"
#檔案新名子
$newname = $i.name.ToString() + "_" + $result
write-host ("Your file new name is: " + $newname)
#重新命名
%{Rename-Item $tmp -NewName ($newname -f $c++)}
#移動命名好的檔案到別的目錄
Move-Item ($Data_Location + $i.name.ToString() + "\" + $newname ) -Desti
nation $move_dir
}
cd ..
}
先說,因為我不懂powershell,所以程式碼都是複製網路教學再經過小改而成XD
所以程式碼內容我也不一定全部都懂(?
如果有什麼問題,歡迎在下面提出。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.116.185.118 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1579496211.A.E58.html
※ 編輯: Eveismywife (122.116.185.118 臺灣), 01/20/2020 13:43:43