gpt4 book ai didi

PowerShell 开关参数需要输入

转载 作者:行者123 更新时间:2023-12-01 08:20:24 25 4
gpt4 key购买 nike

我对什么是最佳实践一无所知。我正在创建一个函数来删除早于的文件,但我想添加一个名为 -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"
}
)
)

关于PowerShell 开关参数需要输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23776841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com