小编Dar*_*te1的帖子

PowerShell Switch参数需要输入

什么是最佳实践,我有点黑暗.我正在创建一个删除早于文件的函数,但是我想添加一个名为-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 …
Run Code Online (Sandbox Code Playgroud)

powershell

2
推荐指数
1
解决办法
1万
查看次数

PowerShell 删除最后一个错误

在我的 PowerShell 脚本中,我尝试进行一些错误处理。但是,我依赖于使用Try/Catch子句的高级函数。因此,函数中的代码块偶尔会失败并Catch在生成错误后转到子句。此时变量$Error被填充了一个错误。

如果我然后在我的脚本中查阅该变量,$Error它会告诉我有一个记录,这是正确的。但是我想知道是否可以只删除Catch子句中函数中的最后一个错误?所以我可以保持我的$Error变量清除脚本错误。

问题出在Get-ADTSProfileHC. 我试图删除最后一个错误,$Error[0] | Remove-Item但失败了。

功能:

Function Get-ADusersHC {

    [CmdletBinding(SupportsShouldProcess=$True)]
    Param(
         [Parameter(ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true,Position=0)]
         [String[]] $OU
    )

    Begin {
        Function Get-ADOUNameHC {
            $CanonicalName = $_.CanonicalName
            [System.Collections.ArrayList]$Pieces = $CanonicalName.split(“/”) 
            $Pieces.Remove($Pieces[-1])
            $OU = $Pieces -join '\'
            $OU -replace ($Pieces[0],$Pieces[0].ToUpper())
        }

        Function Get-ADManagerDisplayNameHC {
            $m = Get-ADObject -Identity $_.manager -Properties displayName,cn
            if($m.ObjectClass -eq "user") { $m.displayName } Else{ $m.cn }
        }

        Function Get-ADTSProfileHC {

            [CmdletBinding()]
            Param( …
Run Code Online (Sandbox Code Playgroud)

error-handling powershell

2
推荐指数
1
解决办法
3382
查看次数

组合2个PowerShell阵列

我正在试图找出如何组合2个阵列,如微软此处所述.

$Source = 'S:\Test\Out_Test\Departments'
$Array = Get-ChildItem $Source -Recurse

$Array.FullName | Measure-Object # 85
$Array.FullName + $Source | Measure-Object # 86
$Source + $Array.FullName | Measure-Object # 1
Run Code Online (Sandbox Code Playgroud)

以下只有1项要迭代:

$i = 0
foreach ($t in ($Source + $Array.FullName)) {
    $i++
    "Count is $i"
    $t
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果$Source$Array为空,它不再生成单独的对象并将它们全部粘在一起,如上例所示.有没有办法强制它成为单独的对象而不是一个连接的对象?

arrays powershell

2
推荐指数
1
解决办法
2131
查看次数

VBS脚本等待返回

我们在 vbs 的帮助下启动 PowerShell 脚本以避免它生成的弹出窗口。这可以完美地工作,如下所示:

PS_Launcher.vbs

'run window totally hidden
Dim oSHELL
Set oSHELL = CreateObject("WScript.Shell")
oSHELL.CurrentDirectory = "C:\users\bob\AppData\Local\Temp"
oSHELL.Run "powershell.exe -ExecutionPolicy Bypass -NoLogo -File .\PS_Script.ps1", 0
Set oSHELL = Nothing
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,当我们从计划任务中或从命令提示符 (CMD) 运行此命令时,它不会等待 PowerShell 脚本完成并立即返回提示符。

有没有办法让它等待 PowerShell 脚本完成后再继续?

我们已按照 中所述尝试了以下操作bWaitForReturn,但没有成功:

oSHELL.Run "powershell.exe -ExecutionPolicy Bypass -NoLogo -File .\PS_Script.ps1", 0, True
Run Code Online (Sandbox Code Playgroud)

PS_Script.ps1

Start-Sleep -Seconds 15

Get-WmiObject -Class Win32_MappedLogicalDisk |
    Select-Object Name, ProviderName |
    Export-Csv .\PS_Data.txt -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)

vbscript powershell

2
推荐指数
1
解决办法
2327
查看次数

格式化百分比小数位并删除尾随零

考虑以下代码:

$Obj = @(
    [PSCustomObject]@{
        LimitNew        = 5368709120
        Usage           = 6166915072
    }
    [PSCustomObject]@{
        LimitNew        = 10737418240
        Usage           = 5368709120
    }
    [PSCustomObject]@{
        LimitNew        = 107374182400
        Usage           = 86973087744
    }
    [PSCustomObject]@{
        LimitNew        = 107374182400
        Usage           = 97710505984
    }
)

$CultInfo = New-Object System.Globalization.CultureInfo -ArgumentList 'en-us',$false
$CultInfo.NumberFormat.PercentDecimalDigits = 2
$Obj |select @{L='pct used';E={($_.Usage/$_.LimitNew).ToString('P', $CultInfo)}}
Run Code Online (Sandbox Code Playgroud)

它返回以下输出:

pct used
--------
114.87 %
50.00 % 
81.00 % 
91.00 % 
Run Code Online (Sandbox Code Playgroud)

我真正想要的是以下输出:

pct used
--------
114.87 %
50 % 
81 % 
91 % 
Run Code Online (Sandbox Code Playgroud)

在阅读文档时,我似乎找不到在其末尾省略尾随零的选项。该方法$CultInfo.NumberFormat.PercentDecimalDigits指定要查看小数点分隔符后的位数,而不是忽略零的位数。

powershell percentage number-formatting

2
推荐指数
1
解决办法
544
查看次数

在空格上拆分字符串但忽略双引号之间的部分

如何拆分此字符串:

$Arguments = '/NOGUI /DATE /EXPAND 4 /SIZEUNIT 3 /SORTTYPE 0 /EXCEL "S:\Test\Brecht\Log Test\Report 13.xlsx" /SHEETNAME "Data set" /SCANPATH "S:\My Folder"'
Run Code Online (Sandbox Code Playgroud)

进入以下数组:

/NOGUI
/DATE
/EXPAND
4
/SIZEUNIT
3
/SORTTYPE
0
/EXCEL
"S:\Test\Brecht\Log Test\Report 13.xlsx"
/SHEETNAME
"Data set"
/SCANPATH
"S:\My Folder"
Run Code Online (Sandbox Code Playgroud)

使用时,$Argument.split(' ')它还会拆分双引号字符串,这是不希望的。在ScriptingGuy 的博客上,他们解释了可能的情况。但我似乎找不到一种方法来忽略双引号之间的字符串。

string powershell split

2
推荐指数
1
解决办法
1029
查看次数

如何使用 graphql 和护照设置身份验证,但仍使用 Playground

将身份验证添加到后端 Graphql 服务器后,“Schema”和“Docs”在 Graphql Playground 中不再可见。在 Playground 中向“HTTP HEADERS”添加令牌时执行查询在经过身份验证时可以正常工作,而在用户未经身份验证时则不能正常工作,所以没关系。

我们禁用了 Apollo 服务器的内置 Playground,并使用中间件graphql-playground-middleware-express来使用不同的 URL 并绕过身份验证。我们现在可以浏览到 Playground 并使用它,但我们无法读取那里的“架构”或“文档”。

尝试启用introspection并没有解决此问题。passport.authenticate()打电话过来会更好Contextapollo-server?还有一个名为Passport-graphql 的工具,但它适用于本地策略,可能无法解决问题。我还尝试在调用 Playground 路由之前在标头中设置令牌,但这不起作用。

我们对此有点迷失。感谢您为我们提供的任何见解。

在此输入图像描述

相关代码:

// index/ts
import passport from 'passport'
import expressPlayground from 'graphql-playground-middleware-express'

const app = express()
app.use(cors({ origin: true }))
app.get('/playground', expressPlayground({ endpoint: '/graphql' }))
app.use(passport.initialize())
passport.use(bearerStrategy)

app.use(
  passport.authenticate('oauth-bearer', { session: false }),
  (req, _res, next) => { next() }
)
;(async () => { …
Run Code Online (Sandbox Code Playgroud)

express passport.js graphql apollo-server passport-azure-ad

2
推荐指数
1
解决办法
4954
查看次数

PowerShell函数返回变量

我正在编写一个函数来创建一个变量$Credentials,我在另一个函数中使用它来验证它是否有效.通过return $Credentials在函数中使用我希望变量在Function Import-Password运行后可用,但事实并非如此.

我认为这可以通过使用来解决$script:Credentials,但我不认为如果函数可以输出这个变量就需要它.

谢谢您的帮助.

功能导入密码

# Check the password file
Function Import-Password ($UserName,$PasswordFile,[switch]$SendMail) {
    try {
        if (!(Test-Path $PasswordFile)) {
            Write-Host "$env:COMPUTERNAME > Check password file: $PasswordFile > The password file can not be found`n
            - Password file :`t $PasswordFile
            - Server name   :`t $env:COMPUTERNAME" -ForegroundColor Yellow
            if ($SendMail) {
                Send-Mail "FAILED AD Authentication" "The password file can not be found" "- Password file : $PasswordFile<br>- Server name   : $env:COMPUTERNAME"
            } …
Run Code Online (Sandbox Code Playgroud)

variables powershell function

1
推荐指数
1
解决办法
4298
查看次数

PowerShell Write-Zip 不保留目录结构

我正在尝试创建一个包含该目录(文件和文件夹)中的所有内容并保留目录结构的 Zip 文件。

通过在网上环顾四周,我发现很多人都有这个问题。因此,为了方便自己,我安装了pscx包含 CmdLet的模块Write-Zip

文件夹结构

- S:\TopFolder
- S:\TopFolder\Folder1
- S:\TopFolder\Folder1\SubFolder1
- S:\TopFolder\Folder1\SubFolder1\Stuff1.txt
- S:\TopFolder\Folder2
- S:\TopFolder\Folder2\SubFolder2
- S:\TopFolder\Folder2\SubFolder2\Stuff2.txt
Run Code Online (Sandbox Code Playgroud)

测试代码

$Test = Get-ChildItem -Recurse 'S:\TopFolder\*'
Write-Zip -Path $Test -OutputPath 'S:\Zippie.zip' -IncludeEmptyDirectories

$Test = Get-ChildItem -Recurse 'S:\TopFolder'
Write-Zip -Path $Test -OutputPath 'S:\Zippie.zip' -IncludeEmptyDirectories
Run Code Online (Sandbox Code Playgroud)

结果是“Zippie.zip”

SubFolder1
SubFolder1\Stuff1.txt
SubFolder2
SubFolder2\Stuff2.txt
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它没有坚持正确的文件夹结构,Folder1并且Folder2丢失了。有什么明显的我在这里失踪了吗?因为此问题已报告为已修复并已验证

感谢您的帮助。

powershell zip 7zip pscx

1
推荐指数
1
解决办法
4311
查看次数

从选择对象启动数组

我正在尝试生成类似的输出字符串Item1, Item2,并用逗号分隔符将其连接起来。我们通过在中初始化一个空数组来实现此目的Select-Object -Property

检查此代码:

$Test =  @(
    [PSCustomObject]@{
        Name = 'Test'
    }
    [PSCustomObject]@{
        Name = 'Test2'
    }
) | Select-Object -Property @{N = 'Problem'; E = { @() } },
@{N = 'EmployeeType'; E = { $null } }, *

foreach ($R in $Test) {
    $R.Problem += 'Item1'
    $R.Problem += 'Item2'
}


$Test | Select-Object -Property @{Name = 'Problem'; Expression = { $_.Problem -join "; " } }, * -ExcludeProperty Problem | fl
Run Code Online (Sandbox Code Playgroud)

结果:

Problem      : …
Run Code Online (Sandbox Code Playgroud)

arrays powershell

1
推荐指数
1
解决办法
50
查看次数