我对Powershell脚本非常陌生,因此请原谅我糟糕的命名约定或不必要的变量。我正在尝试从XML文件中提取所需的信息,并以此名称在新文件夹中重命名该文件,但是我也希望在转换后的文件夹中同时复制原始文件名,以验证所有文件都已转换并能够查明是否丢失了任何文件。
我正在Windows Powershell ISE(x86)中创建此文件。下面的代码成功地给出了副本并移动了文件,然后重命名了文件,但是我在ForEach语句中遇到问题,需要再次递归地复制原始文件名并重命名重复的副本,而不仅仅是重命名已移动的文件。
对于将所需功能添加到以下代码中的任何建议,或关于引发ItemNotFoundException或IOException错误的异常的建议,将非常感谢,因为这将用于重命名一些高度敏感的26000文档。
$srcFolder = "C:\NewDocs\*.xml"
$destFolder = "C:\Converted"
$newFolder = Get-ChildItem $srcFolder -Recurse
Foreach($p in $newFolder) {
[xml]$xml = Get-Content $p
copy-item $srcFolder -Destination $destFolder
}
$convertFolder = Get-ChildItem $destFolder -Recurse
Foreach ($file in $convertFolder) {
[xml]$newXML = Get-Content $file
[string]$NewName = 'User.'+$(newXML.id.extension)
Rename-Item -Path $file.FullName -NewName ($NewName + ".xml")
}
实际结果
C:\NewDocs
Name
1.xml
2.xml
3.xml
4.xml
5.xml
C:\Converted
Name
User.223.xml
User.224.xml
User.225.xml
User.226.xml
User.227.xml
我希望C:\ Converted包含以下结果,并且C:\ NewDocs保持不变
1.xml
2.xml
3.xml
4.xml
5.xml
User.223.xml
User.224.xml
User.225.xml
User.226.xml
User.227.xml
答案 0 :(得分:0)
如果没有重复的文件名,则以下代码将起作用。
$srcDir = "C:\NewDocs"
$destDir = "C:\Converted"
mkdir -Path $destDir -Force > $null
Get-ChildItem -Path $srcDir -Filter *.xml -Recurse |
Copy-Item -Destination $destDir -PassThru |
Copy-Item -Destination {
"{0}\User.{1}.xml" -f $_.Directory, ([xml](Get-Content $_.FullName)).id.extension
}