当前位置: 首页 > 知识库问答 >
问题:

PowerShell:将局部变量传递给函数

崔棋
2023-03-14

我有以下Powershell代码:

function readConfigData
{
    $workingDir = (Get-Location).Path
    $file = ""

    if ($Global:USE_LOCAL_SERVER)
    {
        $file = $workingDir + '\Configs\Localhost.ini'
    }
    else
    {
        $file = $workingDir + '\Configs\' + $env:COMPUTERNAME + '.ini'
    }

    Write-Host 'INIFILE: ' $file

    if (!$file -or ($file = ""))
    {
        throw [System.Exception] "Ini fil är inte satt."
    }
    if (!(Test-Path -Path $file))
    {
        throw [System.Exception] "Kan inte hitta ini fil."
    }
}

readConfigData

我应该如何声明可以传递给函数Test-Path的局部变量$file。我的局部变量$file被填充,但当我将其作为其他函数的参数时,它就像它超出了范围。

我读了关于scopes的文章,但没能弄明白。

当前我收到错误:

ini文件:D:\Projects\scripts\Configs\HBOX。ini测试路径:无法将参数绑定到参数“Path”,因为它是空字符串。在D:\项目\自由职业者。com\nero2000\cmd脚本到powershell\script。ps1:141字符:27如果(!(测试路径-路径$文件))~~~~~类别信息:InvalidData:(:)[测试路径],ParameterBindingValidationException FullyQualifiedErrorId:ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft。PowerShell。命令。TestPathCommand

共有3个答案

狄鹏
2023-03-14

我将定义一个函数Get-ConfigFile来检索配置并为本地服务器添加开关

function Get-ConfigFile
{
    Param(
        [switch]$UseLocalServer
    )

    $workingDir = (Get-Location).Path
    if ($UseLocalServer.IsPresent)
    {
         Join-Path $workingDir '\Configs\Localhost.ini'
    }
    else
    {
         Join-Path $workingDir ('\Configs\{0}.ini' -f $env:COMPUTERNAME)
    }
}

我还将使用Join-Path cmdlet连接路径,而不是字符串连接。

现在您可以使用以下命令检索配置文件路径:

$configFile = Get-ConfigFile -UseLocalServer:$Global:USE_LOCAL_SERVER

如果需要,请确保文件存在:

if (-not(Test-Path -Path $configFile))
{
    throw [System.Exception] "Kan inte hitta ini fil."
}

注意:Get Location将为您提供当前powershell路径(工作位置),如果要获取脚本所在的路径,请改用此路径:

$workingDir = split-path -parent $MyInvocation.MyCommand.Definitio
云俊名
2023-03-14

正如其他人所提到的,您在第一个if(!$file…语句中无意中为$file指定了一个空字符串。这确实是您的问题的根源。

但是,代替:

if (!$file -or ($file = ""))

你可以使用这个forumula,我发现它可以更好地解释自己:

if([String]::IsNullOrEmpty($file))
汪安然
2023-03-14
if (!$file -or ($file = ""))

应替换为

if (!$file -or ($file -eq ""))

您将$file分配给第一个if子句中的空字符串,因此您的变量在Test-Path调用中为空。

编辑:还有一些选择:如何在PowerShell中检查字符串是否为null或空?

你可以用

if([string]::IsNullOrEmpty($file))

甚至只是

if(!$file)
 类似资料:
  • 问题内容: 我想编写Docker容器管理的脚本,但是我发现很难将PS变量传递给Docker命令,特别是由于路径格式的差异。 以下行(*)和您可以在此处找到的赞都可以 使用,但是很不方便: 的确,PS 非常适合MSI安装程序,您需要查看弹出窗口并控制其可见性级别,以便了解无提示安装程序正在运行。取而代之的是,您不想每次运行控制台应用程序时都启动一个新窗口,尤其是在Docker中,在其中您与调用程序和

  • 问题内容: 此代码无法正常工作。我想要的只是将变量发送到 正确的方法是什么?: 脚本 问题答案: myFile.php:

  • 问题内容: 我有Google地图提供的JavaScript值,需要将其保存在MySQL数据库中。 其实我有变量 我需要将该变量传递给PHP变量lugar 问题答案: 如果要在页面转换时进行操作,则可以通过表单或在URL中传递它,然后仅使用或接收变量。 如果您需要无缝完成它,那么您可能需要考虑使用AJAX。

  • 问题内容: 我正在使用TodoMVC应用程序来更好地使用AngularJS框架。在第14-16行的index.html中,您将看到以下内容: 注意 ng-submit 指令如何在不将 newTodo 模型作为参数传递的情况下调用 addTodo() 函数。 __ 不久之后,我在第19行的同一文件中遇到了以下代码: 您可以看到作者这次决定将 allChecked 模型传递给 markAll() 函数

  • 问题内容: doc中的示例: 但是,如果我需要使用这样的外部变量,该怎么办: 现在,我创建了新属性,并通过访问了它,但是还有其他更便捷的方法吗? 问题答案: 您可以使用关键字将必要的变量从父范围传递到闭包中。 例如: 在这里更多。 编辑(2019更新): PHP 7.4(将于2019年11月28日发布)引入了一种称为箭头函数的匿名函数的较短变体,这使得它的冗长程度有所降低。 使用PHP 7.4的示

  • 问题内容: 我有一个PHP会话变量,在整个会话过程中仍然有效。在开头部分,我包含了我的JavaScript文件。 如果需要以下内容,如何将会话变量传递到JavaScript文件中。 由于无法在JavaScript文件中识别出,因此上面的代码不起作用。因此,我必须放入PHP文件本身,但是如何将其保留在JavaScript文件中? 问题答案: 在您的PHP文件中,您可以将用户设置为全局变量: 在包含外