繁体   English   中英

PowerShell Switch参数需要输入

[英]PowerShell Switch parameter requires input

对于最佳实践,我有些茫然。 我正在创建一个删除文件的功能,但我想添加一个名为-Remote的开关,该开关是可选的,但是当您选择使用它时,该开关需要强制信息,例如$Server才能执行下面的整个功能通过使用Invoke-Command在远程服务器上。

像这样:

Delete-OldFiles -Target "\\\\Share\\Dir1" -OlderThanDays "10" -LogName "Auto_Clean.log" -Remote "SERVER1"

脚本/功能

Function Delete-OldFiles
{
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$True,Position=1)]
    [ValidateScript({Test-Path $_})]
    [String]$Target,
    [Parameter(Mandatory=$True,Position=2)]
    [Int]$OlderThanDays,
    [Parameter(Mandatory=$True,Position=3)]
    [String]$LogName
      )

if ($PSVersionTable.PSVersion.Major -ge "3") {

# PowerShell 3+ Remove files older than (FASTER)
    Get-ChildItem -Path $Target -Exclude $LogName -Recurse -File | 
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$OlderThanDays) } | ForEach {
        $Item = $_.FullName
        Remove-Item $Item -Recurse -Force -ErrorAction SilentlyContinue
        $Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()      
        # If files can't be removed
        if (Test-Path $Item)
            { "$Timestamp | FAILLED: $Item (IN USE)" } 
        else
            { "$Timestamp | REMOVED: $Item" }  
        } | Tee-Object $Target\$LogName -Append } # Output file names to console & logfile at the same time

Else {               

# PowerShell 2 Remove files older than
Get-ChildItem -Path $Target -Exclude $LogName -Recurse | 
    Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays(-$OlderThanDays) } | ForEach {
        $Item = $_.FullName
        Remove-Item $Item -Recurse -Force -ErrorAction SilentlyContinue
        $Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()      
        # If files can't be removed
        if (Test-Path $Item)
            { 
            Write-Host "$Timestamp | FAILLED: $Item (IN USE)"
            "$Timestamp | FAILLED: $Item (IN USE)"
             } 
        else
            { 
            Write-Host "$Timestamp | REMOVED: $Item"
            "$Timestamp | REMOVED: $Item"
            }  
        } |  Out-File $Target\$LogName -Append } 
}

Delete-OldFiles -Target "\\Share\Dir1" -OlderThanDays "10" -LogName "Auto_Clean.log" 
#Delete-OldFiles "E:\Share\Dir1" "5" "Auto_Clean.log"

当我掌握这一点时,我可以使$LogName (日志文件)成为可选的。 谢谢您的帮助。 我仍然对PowerShell还是陌生的,并试图弄清楚这些东西。

您可以使用像这样的参数

Param (
[switch] $Remote = $false,
[string] $server = $( 
    if ($Remote) 
        { 
            Read-Host -Prompt "Enter remote server:" 
        } 
    )
)

在这种情况下,如果调用不带-Remote的脚本,则$ server将保持$ null。

如果您要调用script.ps1 -Remote ,它将要求您输入服务器名称。

如果您将其像scripts.ps1 -Remote -server "Servername" ,则$ server将成为Servername。

将功能包装到基于switch的Invoke-Command中可能很复杂,但是您始终可以使用Invoke-Command(它应与直接命令一样快),只需使用这样的参数

Param (
[switch] $Remote = $false,
[string] $server = $( 
    if ($Remote) 
        { 
            Read-Host -Prompt "Enter remote server:" 
        } 
    else
        {
            "localhost"
        }
    )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM