除非使用 break 语句,否则 Echo 语句在 ForEach-Object 循环内不起作用。为什么?还有什么替代方法可以解决这个问题?

除非使用 break 语句,否则 Echo 语句在 ForEach-Object 循环内不起作用。为什么?还有什么替代方法可以解决这个问题?

我正在设计自己的功能将 .ps1 文件重命名为 .psm1与.ps1 文件同名。

例如:Add-UdfUser.ps1将成为 A dd-UdfUser.psm1

它运行完全正常。它将名称更改为与 .ps1 文件相同的名称。

唯一的问题是,当您回显将 $PSFileName 重命名为 $NewName 或回显文件 $PSFileName 不存在时,除非您使用 break 语句,否则它不会打印在屏幕上。

有人能告诉我为什么会发生这种情况以及还有什么其他方法可以解决这个问题吗?

以下是供参考的代码 -

Function Rename-UdfFunction{
[cmdletbinding()]
Param(
[Parameter(Mandatory)]
[String]$PSFileName,
[Parameter(Mandatory)]
[String]$UdfModulePath
)
[String]$SplitName = $PSFileName -split '.ps1' | ForEach-Object {
if ((get-childitem -name -path $UdfModulePath) -match $PSFileName ){
[String]$NewName = $_.TrimEnd()+'.psm1'
Rename-Item -Path $UdfModulePath\$PSFileName -NewName $NewName
echo "$PSFileName renamed to $NewName"
#break
}else{
echo "The file $PSFileName doesnot exist"
#break
}


}


}

答案1

这里有一个重构来处理您的用例。每个阶段都有验证的结果。

Function Rename-UdfFunction
{
    [cmdletbinding(SupportsShouldProcess)]
    Param
    (
        [Parameter(Mandatory)][String]$PSFileName,
        [Parameter(Mandatory)][String]$UdfModulePath
    )


    If (Test-Path -path "$UdfModulePath\$PSFileName")
    {
        "$PSFileName already exists.  Renaming file."
        $NewName = "$($PSFileName.Split('.')[0]).psm1"
        Rename-Item -Path "$UdfModulePath\$PSFileName" -NewName $NewName 
        "Rename of $PSFileName to $NewName completed."
    }
    Else
    {Write-Warning -Message "The file $PSFileName does not exist in the target $UdfModulePath." }
}

Clear-Host
Rename-UdfFunction -PSFileName 'TestFile.ps1' -UdfModulePath 'C:\Temp' -WhatIf

# Results
<#
WARNING: The file TestFile.ps1 does not exist in the target C:\Temp.
#>

# after copying the file to that location.
<#
TestFile.ps1 already exists.  Renaming file.
What if: Performing the operation "Rename File" on target "Item: C:\Temp\TestFile.ps1 Destination: C:\Temp\TestFile.psm1".
#>

# Results
<#
TestFile.ps1 already exists.  Renaming file.
Rename of TestFile.ps1 to TestFile.psm1 completed.
#>

相关内容