PowerShell - เปลี่ยนชื่อรายการ: ไม่สามารถแปลง 'System.Object []' เป็นประเภท 'System.String' ที่ต้องการโดยพารามิเตอร์ 'NewName'


2

ฉันพยายามเปลี่ยนชื่อไฟล์เป็นจำนวนมากด้วย PowerShell แต่ฉันพบข้อผิดพลาดซึ่งฉันไม่รู้ว่าจะทำอย่างไรและการค้นหามันไม่ได้ให้วิธีการแก้ปัญหาเช่นกัน

ข้อความผิดพลาด:

Rename-Item : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'NewName'.


ตัวอย่างเช่น: 2068227794 (0x8f860be3).bnkถึง0x8f860be3_0001.bnk

ในกรณีนี้โดยเฉพาะอย่างยิ่งคือ$hex_name0x8f860be3

$source = "K:\_test"

Get-ChildItem -Path $source -File -Recurse -Include "* (0x*).*" | ForEach-Object {

   $prefix, $hex_name = ($_.BaseName).Split('()')
   Rename-Item -Path $_ -NewName ($hex_name + "_0001" + $_.Extension)

}

2
การแยกนั้นจะส่งคืนสามองค์ประกอบดังนั้น $ hex_Name จะเป็นอาร์เรย์ที่มีสององค์ประกอบ
EBGreen

ชื่อไฟล์ตัวอย่างคืออะไรและคุณคาดหวังว่าชื่อใหม่จะเป็นอย่างไร ตัวอย่างข้อมูลและความคาดหวังเป็นสิ่งสำคัญสำหรับการถามคำถามที่ดี
EBGreen

1
ลองอ้างอิง$hex_name[0]เพื่อรับสิ่งที่0x8f860be3ปราศจาก parens หรือเปลี่ยนสิ่งที่คุณชอบ$firstParen, $hex_name, $secondParenAndExt = ($_.BaseName).Split('()')
Frank Thomas

3
$ hex_name = ($ _. BaseName) .Split ('()') [1]
EBGreen

ฉันคิดว่าคุณได้ลองสิ่งที่ชอบ($hex_name + "_0001" + $_.Extension).ToString()และได้รับการยืนยันแล้วว่าไม่ได้ผล docs.microsoft.com/en-us/dotnet/api/… . แม้ว่าคุณจะต้องตั้งค่าเป็นตัวแปรภายในลูปแล้วใช้กับRename-Item.... เพียงแค่ไอเดียที่รวดเร็วโดยไม่มีการทดสอบ
Pimp Juice IT

คำตอบ:


2

เมื่อตอบคำถามนี้ในความคิดเห็นฉันจะตอบคำถามของฉันเอง

ข้อผิดพลาดเกิดขึ้นเนื่องจาก$hex_nameเป็นอาร์เรย์ที่มีสตริงฐานสิบหกและส่วนที่เหลือ มีวิธีแก้ปัญหาง่าย ๆ 2:

การเลือกรายการโดยตรง:

$hex_name = ($_.BaseName).Split('()')[1]

การกำหนดส่วนที่เหลือที่ไม่ต้องการให้กับตัวแปรใหม่:

$prefix, $hex_name, $rest = ($_.BaseName).Split('()')

เครดิตทั้งหมดไปที่EBGreen

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.