我有一些長檔案名可能會導致 Windows 路徑最大字符出現問題,我想重命名它們以保留其中的一部分 - 并添加一個 RNG 4 字母/數字組合。
檔案名示例: 478432_1400_79834_SomeKindofText_UserInputSoItCanBeReallyLongCombinedWithANetworkPath.jpg
想要的重命名結果:
478432_1400_79834_SomeKindofText_abc1.jpg
其中“abc1”表示校驗和的 4 個字母/數字組合
這是我到目前為止的代碼:
$search_folder = "C:\PS\Test\"
Get-ChildItem $search_folder -File | ForEach-Object {
$checksum = Get-FileHash -Path $_
$checksum = $checksum.substring(0,3)
Rename-Item -NewName { $search_folder $_.BaseName.Split('_')[0..3] $checksum $_.Extension }
}
我的第一個問題是Get-FileHash不支持 substring 方法,生成錯誤訊息:
Method invocation failed because [Microsoft.Powershell.Utility.FileHash] does not contain a method named 'substring'.
我的第二個問題是它試圖在我當前的 PS shell 目錄而不是 $search_folder 中執行 Resolve-Path
我的第三個問題是檔案名中的下劃線沒有保留,因此 Rename-Item 方法上的 -WhatIf 標記會產生類似“478432 1400 79834 SomeKindofText”的結果
提示或建議將是最受歡迎的!
uj5u.com熱心網友回復:
我的第一個問題是 Get-FileHash 不支持 substring 方法,生成錯誤訊息:
Method invocation failed because [Microsoft.Powershell.Utility.FileHash] does not contain a method named 'substring'.
$checksum不存盤哈希字串,它存盤一個具有名為的屬性的物件,該屬性Hash又存盤您想要的字串,因此更改此行:
$checksum = $checksum.substring(0,3)
到:
$checksum = $checksum.Hash.Substring(0,3)
我的第二個問題是它試圖在我當前的 PS shell 目錄而不是 $search_folder 中執行 Resolve-Path
這個問題的兩個通用解決方案:
顯式傳遞檔案的絕對路徑:
Rename-Item -LiteralPath $_.FullName -NewName { ... }或者將輸出
Get-ChildItem直接從管道傳輸到Rename-Item并讓 PowerShell 正確系結路徑:$_ |Rename-Item -NewName { ... }
我的第三個問題是檔案名中的下劃線沒有保留,因此 Rename-Item 方法上的 -WhatIf 標記會產生類似“478432 1400 79834 SomeKindofText”的結果
拆分字串'_'也將洗掉下劃線 - 要反轉這一點,請'_'在-join操作中用作分隔符:
$firstFourPartsOfBaseName = $_.BaseName.Split('_')[0..3] -join '_'
把這一切放在一起,我們得到:
$search_folder = "C:\PS\Test\"
Get-ChildItem $search_folder -File | ForEach-Object {
$checksum = Get-FileHash -Path $_
$checksum = $checksum.hash.substring(0,3)
$_ |Rename-Item -NewName {
# calculate new base name ("478432_1400_79834_SomeKindofText_abc1")
$newBasename = @($_.BaseName.Split('_')[0..3]; $checksum) -join ''
# add extension and output
$newBasename,$_.Extension -join '.'
}
}
uj5u.com熱心網友回復:
請參閱下面調整的腳本:
$search_folder = "C:\PS\Test\"
Get-ChildItem $search_folder -File | ForEach-Object {
$checksum = Get-FileHash -Path $_
$checksum = $checksum.hash.substring(0,3)
Rename-Item -Path $_ -NewName ($search_folder $_.BaseName.Split('_')[0..3] $checksum $_.Extension)
}
您試圖獲取物件的子字串,使用屬性hashon$Checksum將允許您創建子字串。
我還添加-path了rename-item請求并更改了字串構造的括號(可能是其中任何一個導致您出現問題,不幸的是我沒有對此進行測驗。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/420886.html
標籤:
