1

我有几行在远程目录中查找的 powershell 代码

Get-ChildItem "\\box_lab001\f$\output files" -force | 
    Where-Object {!$_.PsIsContainer -AND $_.lastWriteTime -lt (Get-Date).AddMinutes(-5) } | 
    Select-Object LastWriteTime,@{n="Path";e={convert-path $_.PSPath}} | 
    Tee-Object "\\\box_lab001\c$\Users\john\Documents\output files_root.txt" | 
    Remove-Item -force

我想要做的是让这个在多个盒子中可扩展,如果用户在 box_lab01 上看到问题,槽 10。然后他可以使用一个要求输入的开关运行脚本。然后它会单独运行命令,每次都替换 box_lab###,可能吗?

C:\powershell.ps1 -input what boxes are having the issue? use three digit numbers only, comma separated

4

2 回答 2

1

您想要添加一个参数,该参数将一组值作为输入。然后,您可以使用这些来检查每台机器:

[CmdletBinding()]
param(
    [int[]]
    # The numbers of the machines whose output files should be removed.
    $MachineNumbers
)

$MachineNumbers | ForEach-Object {
    $machineRoot = '\\box_lab{0:d3}' -f $_ 
    Get-ChildItem ('{0}\f$\output files' -f $machineRoot) -force | 
        Where-Object {!$_.PsIsContainer -AND $_.lastWriteTime -lt (Get-Date).AddMinutes(-5) } | 
        Select-Object LastWriteTime,@{n="Path";e={convert-path $_.PSPath}} | 
        Tee-Object ('{0}\c$\Users\john\Documents\output files_root.txt' -f $machineRoot)  | 
        Remove-Item -force

该代码('\\box_lab{{0:d3}}' -f $_)将从用户传递的每个数字转换为一个零填充的三个字符串(这似乎是您的计算机命名方案)。然后你会这样调用你的脚本:

 Remove-OutputFiles -MachineNumbers (1..10)
 Remove-OutputFiles -MachineNumbers 1,2,3,4,5

您可以给MachineNumbers参数一个合理的默认值,这样如果没有传递任何参数,它就会命中一组默认机器。

我还将将该[CmdletBinding()]属性添加到您的脚本,以便您可以传递-WhatIf给您的脚本并查看哪些文件将被删除而不实际删除它们:

Remove-OutputFiles -MachineNumbers (1..3) -WhatIf
于 2012-06-12T19:13:46.193 回答
0

是的。

您可以使用Read-Host提示输入。您可以使用param(...)向脚本添加参数:

param($input = $null)
if ($input) {
    $foo = Read-Host -Prompt $input
}

然后,您可以使用以下方法获取各个数字-split

$numbers = $foo -split ','

循环它们:

$numbers | ForEach-Object {
  ...
}

您可以$_在块内使用来引用当前编号。

于 2012-06-12T15:51:38.487 回答