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 $_)は、ユーザーから渡された各数値をゼロで埋められた 3 文字の文字列に変換します (これは、コンピューターの命名方式のようです)。次に、次のようにスクリプトを呼び出します。

 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 に答える