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

Powershell-将Validateset参数传递到Foreach对象时遇到故障,得到提示

越麒
2023-03-14

所以我是PowerShell的新手,我正在尝试让这个函数工作。我有2个ValidateSet数组,有3个参数。这些参数应该用来更改文件路径,并将它们从一个服务器复制到另一个服务器。由于某种原因,我一直得到参数的命令提示符,而不是它们通过。我猜这是foreach对象的问题,但我很茫然。但是,它是为$archivePath工作的。我是新来的,所以请温柔点...TIA


param(

    [Parameter(Mandatory = $true)]
    [ValidateSet("One", "Two", "Three")]
    [string[]]$Channel

    ,[Parameter(Mandatory = $true)]
    [Alias('Phase')]
    [ValidateSet("Devl", "Test", "Prod")]
    [string[]]$Phase

    ,[Parameter(Mandatory = $false)]
    [string]$FilenameFilter = '.csv'

    ,[Parameter(Mandatory = $false)]
    [switch]$CreateTrigger
    )


function ExitWithCode { param($exitcode) $host.SetShouldExit($exitcode); exit $exitcode }

$exitcode = 0

try {

    # Get a list of files on the host server.
    #
   $files = Get-ChildItem -File -Path "\\ServerName\d\Extract\$Phase\FileTransfer\$Channel\Outbound"        

    # Destination directory.
    #
    $LocalPath = "\\ServerName\d\Extract\$Phase\FileTransfer\$Channel\Outbound"     #for testing


    # Set up folder name for Archive server. Formated as YYYYMMDDTHHMMSS  YYYYMMDD --> Var_Date, 'T' --> Var_Constant & HHMMSS --> Var_Time
    #
    $Var_Date = get-date -UFormat "%Y-%m-%d"
    $Var_Constant = 'T'
    $Var_Time = get-date -UFormat "%H-%M-%S"
    $Var_Fulldate = $Var_Date + $Var_Constant + $Var_Time

    $ArchivePath = $env:USERPROFILE + "\Desktop\$Channel\$Var_Fulldate"     #For testing
    New-Item -Type Directory -Path $ArchivePath


    if (-not (Test-Path -Path $ArchivePath -ErrorAction SilentlyContinue)) { $ArchivePath = $Env:TEMP }

    #Look for files in Outbound directory and remove
    Get-ChildItem -File -Path $LocalPath | ForEach-Object { Copy-Item $_.FullName } #Using copy instead of remove for test
    $FileCount = 0

Write-Output Try2   #for testing
pause               #for testing

    foreach ($file in $files) {
        if ((-not $file.IsDirectory) -and ($File.FullName -match $FilenameFilter)) {

            $localfilename = $LocalPath + $file.Name

            if (Test-Path $localfilename) { Copy-Item $localfilename }

            try {

                Copy-Item -Path $(Join-Path -Path $LocalPath -ChildPath $file.Name) -Destination $ArchivePath
    #Remove files from outbound since they've been archived
    #
                #Remove-Item -Path $file.FullName

            "Retrieved file $file"

                $FileCount++
            }
            catch {
                Write-Output Try13  #for testing
                $exitcode = 13
                "failed to retrieve $file"
            }
            finally {
                $error.Clear()
            }
        }
    }

}
catch {
Write-Output Try3
    $exitcode = 14
}
finally {
Write-Output Try4
    $error.Clear()
}

if ($CreateTrigger -and ($exitcode -eq 0) -and ($FileCount -gt 0)) {
    New-Item -Path "$LocalPath\Trigger_File.trg" -ItemType File | Out-Null
}

#ExitWithCode $exitcode     # take out for testing

输出:

PS C:\Users\me> \\Server\blah\USERS\me\My Documents\Folder\Get-FileName_t4.ps1
cmdlet Get-FileName_t4.ps1 at command pipeline position 1
Supply values for the following parameters:
Channel[0]: Three
Channel[1]: 
Phase[0]: Devl
Phase[1]: 


    Directory: C:\Users\me\Desktop\Three


Mode                LastWriteTime         Length Name                                                                                                
----                -------------         ------ ----                                                                                                
d-----       11/22/2019  12:17 PM                2019-11-22T12-17-23                                                                                 
Try2
Press Enter to continue...: 
Retrieved file File1_20191122080912.csv
Retrieved file File2_20191122080922.csv
Retrieved file File3_20191122080925.csv
Retrieved file File4_20191122080932.csv
Retrieved file File5_20191122080933.csv
Retrieved file File6_20191122080933.csv
Try4

共有1个答案

南宫凡
2023-03-14

您会得到提示,因为您没有传入这些参数,但是mandatory=$true设置在您得到提示的参数上。由于您的会话是交互式的,它要求您输入正确的值。如果不希望得到提示,请提供强制参数:

"\\Server\blah\USERS\me\My Documents\Folder\Get-FileName_t4.ps1" -Channel Three -Phase Dev1

我注意到了另外几件事:

  • 您不需要提供mandatory=$false,因为mandatory默认为$false
  • -phase参数设置phase别名也是多余的
 类似资料:
  • 我当前正在尝试使用脚本列出远程计算机上已安装的程序。 我不仅要捕获远程程序列表,而且要捕获一个系统直接向前的版本。 但是,当我在多个系统中循环时,就会完全丢失和字段。

  • 编辑:底部的工作代码 我对编程相对较新,我正在试图理解为什么这不起作用。我决定通过一个函数而不是来处理卡片,以保持它尽可能模块化。这是我下面的代码;我知道错误与指针有关,但我不明白我做错了什么。 工作代码:

  • 在一个DOM操作练习中,我学习了如何使用纯JavaScript创建HTML元素。也就是像这样的东西: 我必须创建一个函数,允许用户将对象作为参数传入,以设置元素的属性。这个对象包含任意数量的键(属性)和值(属性值)。即属性可以是“src”,值可以是“image.jpg”。类似的东西。用户可以在调用函数时向此对象传递任意多的属性。 附带说明,对代码和JS都很新,请原谅我:P

  • 问题内容: 我试图将对象数组从js传递到rails 滑轨 在这里,记录器语句总是让我把 我期望下面的登录轨道。 问题答案: 您应该在Javascript中使用Javascript,该Javascript以数组或哈希作为参数(因为它们是唯一有效的JSON构造)。它返回一个形式,该形式是序列化为JSON的Javascript对象。 在Ruby方面,您将收到JSON编码的字符串,因此需要(在Rails中

  • 如何获得[0]。。。,[4] 下面对象的参数值? 下面看到的对象是EntityManager的结果。createNativeQuery()。我想使用这些值创建一个POJO。我知道我可以用EntityManager。createNativeQuery(“SQL查询”,MyPOJO.class),但它只返回ID为的POJO,所有其他变量都为null?!我对如何获取物体的参数很感兴趣。 不可能将返回的对

  • 当我试图在调试模式下运行eclipse时,我遇到了一个问题。我在eclipse中将app jar添加到Tomcat6.0中,当我试图调试或启动tomcat服务器时,它会一次又一次地抛出这个错误。我尝试在管理模式下运行eclipse,但即使这样也没有帮助。PFB错误详细信息! 正在发布配置...将文件复制到C:/software/software/apache-tomcat-6.0.41/backu