我编写了一个脚本(PowerShell≥3),该脚本基本上会查找某些文件,然后检查文件名是否已在以后将文件复制到的路径中使用,如果是,它将_OutCopy
添加到名字。 它的作用还不止于此,但这与这个问题无关。
#requires -version 3
Function Start-FileSearch(){
param(
[string]$InputPath = $(throw 'InputPath not set'),
[string]$Format = $(throw 'Format not set')
)
$InFiles = @()
$InFiles = @(Get-ChildItem -LiteralPath $InputPath -Filter $Format -Recurse -File | ForEach-Object {
[PSCustomObject]@{
InFullName = $_.FullName
OutName = "ZYX"
}
})
return $InFiles
}
Function Start-OverwriteProtection(){
param(
[string]$OutputPath = $(throw 'OutputPath not set'),
[array]$InFiles = $(throw 'InFiles not set')
)
$NewFiles = $InFiles
for($i=0; $i -lt $NewFiles.Length; $i++){
$NewFiles[$i].OutName = "$($NewFiles[$i].OutName)_OutCopy" # this, of course, is simplified.
}
return $NewFiles
}
Function Start-AllStuff() {
$InFiles = @(Start-FileSearch -InputPath "D:\Temp\In_Test" -Format "*.jpg")
$InFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
$NewFiles = @(Start-OverwriteProtection -OutputPath "D:\Temp" -InFiles $InFiles)
$InFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
$NewFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
}
Start-AllStuff
很明显,第二个$InFiles | Format-Table
也应该为"ZYX"
输出.OutName
-但是,它包括已经更改的值。
我尝试过的事情:
private:
范围内,Start-Allstuff()
的内部/外部,$InFiles
)/不重命名变量(即如上所示,$NewFiles
)。$InFiles = @(Start-FileSearch
[...] ); $InFiles
)没有帮助。
到目前为止,我的理解是,如果不直接调用变量,则不可能更改。 (例如$InFiles = $OutFiles
应该更改左侧的变量,而不是右侧的变量。)
对于所有想知道的人:是的,我进一步研究了previous question ("Compare-Object does not work with PSCustomObjects from another script")的问题,发现这一定是它不起作用的原因-至少这是原因之一
答案 0 :(得分:1)
iRon是正确的,您需要克隆PSObject,下面的代码。
$NewFiles = $InFiles
$NewInFiles = $InFiles | select *
for($i=0; $i -lt $NewFiles.Length; $i++){
.........................
$NewFiles = @(Start-OverwriteProtection -OutputPath "D:\" -InFiles $InFiles)
$NewInFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
$NewFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
看起来您的for循环正在修改$ InFiles,请查看我的结果。经过随机图像测试。