【问题标题】:Powershell runs script from previous editPowershell 运行先前编辑的脚本
【发布时间】:2021-11-19 12:07:56
【问题描述】:

我正在 VSCode 中练习 Powershell。 我注意到当我按 F5 运行我的脚本时,Powershell 运行脚本的以前版本(在我的更改之前)。编辑后我肯定会保存文件。 因此,例如,我可能会更改此行中的文本:

Add-Content -Path "D:\Text_File.txt" -value "$_ - MP3 File count is: $Cnt" 

但它会继续显示相同的输出,直到我第二次运行它。

这是我正在使用的脚本,以防相关:

Param(
    [string]$Path = 'D:\WMA - BU of wma music files',
    [string]$DestinationPath = "D:\WMA-Only",
    [string]$OutputFileDest = "D:\Text_File.txt"
)

$MainDirList = Get-ChildItem -Path $Path -Directory | ForEach-Object {$_.FullName}

$MainDirList | Out-File -FilePath D:\Text_File.txt

$MainDirList | WriteFolder

function WriteFolder
{
    process 
    {
        $FilteredList = Get-ChildItem -Path $_ -Force -Recurse -Filter "*.mp3"
        
        $Cnt = $FilteredList.count
        Add-Content -Path "D:\Text_File.txt" -value "$_ - MP3 File count is: $Cnt"
    }
}

Visual Studio 代码版本为 1.62.2 Powershell 扩展是 v2021.10.2

我想知道我是否打算在脚本末尾清除变量等? 我在最新版本的notepad++中查看输出

【问题讨论】:

  • 可能是因为您在另一个函数中定义了一个函数?通常,当您运行脚本时,它会在运行脚本之前找到任何函数并对其进行预处理。但在你的情况下,它只处理外部函数,它只在运行时创建内部函数。
  • @SteveTaylor,值得一看。感谢您的领导。我会看到的。
  • 我添加了一个答案,以防万一它有帮助 - 通常最佳做法是在脚本的标题中描述所有函数,或者作为脚本的单独模块 (*.psm1)加载。
  • 我玩过这个想法,但我没有解决这个问题。我将函数放入不同的文件中,起初我得到了相同的行为。我删除了“进程”块,输出没有更新,但是多次尝试后输出没有更新。很明显,函数被存储在某个地方。
  • 哦,如果您现在将函数存储在外部,这是一个稍微不同的问题 - 如果您已经从另一个文件(可能通过 Import-Module)加载它,您将必须应用-Force 参数从第二次运行开始,以确保它覆盖存储的脚本。 Import-Module $myModule -Force

标签: powershell visual-studio-code


【解决方案1】:

可能是因为您在另一个函数中定义了一个函数?通常,当您运行脚本时,它会在运行脚本之前找到任何函数并对其进行预处理。但在你的情况下,它只处理外部函数,它只在运行时创建内部函数。

我不确定您的父函数被称为什么,但您可以尝试将这两个函数并排放置:

Function myFunction{
    Param(
        [string]$Path = 'D:\WMA - BU of wma music files',
        [string]$DestinationPath = "D:\WMA-Only",
        [string]$OutputFileDest = "D:\Text_File.txt"
    )
    Process{
        $MainDirList = Get-ChildItem -Path $Path -Directory | ForEach-Object {$_.FullName}
        $MainDirList | Out-File -FilePath D:\Text_File.txt
        $MainDirList | WriteFolder
    }
}



function WriteFolder
{
    process 
    {
        $FilteredList = Get-ChildItem -Path $_ -Force -Recurse -Filter "*.mp3"
        
        $Cnt = $FilteredList.count
        Add-Content -Path "D:\Text_File.txt" -value "$_ - MP3 File count is: $Cnt"
    }
}

或者您可以将 WriteFolder 函数移动到它自己的 Powershell 模块 (*.psm1) 中并将其加载到您的主脚本中:

Import-Module "WriteFolder.psm1" -Force

-Force 参数是可选的,但如果您经常更改模块文件,则需要它来确保加载更新,而不是仅仅缓存旧版本的模块。

【讨论】:

  • 我实际上并没有函数中的原始脚本。我打算把它合二为一,因此是“参数”规范,但还没有达到这一点。当我删除“参数”块时,它的行为仍然相同。我想一种解决方案是单独运行已编辑的功能以便注册?我不能说这是答案,但你肯定让我走上了正确的轨道。谢谢。您可以编辑它以从上方反映您的 cmets,我会将其标记为已回答吗?
  • @dra_red - 没问题 - 我已经更新了答案以呈现这两个选项 - 只是将函数并排放置,或者像现在一样从单独的模块加载第二个。是否捕捉到了你想看到的一切?
  • @SteveTaylor,将function WriteFolder 放在function MyFunction 之前会有什么不同吗?
  • @lit - 老实说,只要他们都处于脚本的基础级别,他们都应该非常高兴。当脚本运行时,它应该在实际运行任何其他代码行之前加载它在直接基本级别找到的 all 函数。最初的问题是第二个函数是 inside 第一个,而不是它们进入的顺序。尽管最佳实践表明您应该在脚本的 top 声明所有函数为了一致性。
猜你喜欢
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多