2017-06-29 7 views
0

Ich versuche, zu spezifizieren, um meinen Dateipfad im Skript angeben, dass ich von hier bekam: https://gallery.technet.microsoft.com/scriptcenter/Outputs-directory-size-964d07ffversuchen, den Dateipfad

Die aktuelle Dateipfad verweist auf das Verzeichnis, aber ich bin nicht in der Lage die Variable zu finden, die ich müssen geändert werden, um einen anderen Pfad anzugeben.

# Get-DirStats.ps1 
    # Written by Bill Stewart ([email protected]) 
    # Outputs file system directory statistics. 

    #requires -version 2 

<# 
.SYNOPSIS 
Outputs file system directory statistics. 

.DESCRIPTION 
Outputs file system directory statistics (number of files and the sum of   all file sizes) for one or more directories. 

.PARAMETER Path 
Specifies a path to one or more file system directories. Wildcards are not  permitted. The default path is the current directory (.). 

.PARAMETER LiteralPath 
Specifies a path to one or more file system directories. Unlike Path, the value of LiteralPath is used exactly as it is typed. 

.PARAMETER Only 
Outputs statistics for a directory but not any of its subdirectories. 

.PARAMETER Every 
Outputs statistics for every directory in the specified path instead of only the first level of directories. 

.PARAMETER FormatNumbers 
Formats numbers in the output object to include thousands separators. 

.PARAMETER Total 
Outputs a summary object after all other output that sums all statistics. 
#> 

[CmdletBinding(DefaultParameterSetName="Path")] 
param( 

[parameter(Position=0,Mandatory=$false,ParameterSetName="Path",ValueFromPipeline =$true)] 

    $Path=(get-location).Path, 
    [parameter(Position=0,Mandatory=$true,ParameterSetName="LiteralPath")] 
    [String[]] $LiteralPath, 
    [Switch] $Only, 
    [Switch] $Every, 
    [Switch] $FormatNumbers, 
    [Switch] $Total 
) 

begin { 
    $ParamSetName = $PSCmdlet.ParameterSetName 
    if ($ParamSetName -eq "Path") { 
    $PipelineInput = (-not $PSBoundParameters.ContainsKey("Path")) -and (- 
    not $Path) 
    } 
elseif ($ParamSetName -eq "LiteralPath") { 
$PipelineInput = $false 
} 

# Script-level variables used with -Total. 
[UInt64] $script:totalcount = 0 
[UInt64] $script:totalbytes = 0 

# Returns a [System.IO.DirectoryInfo] object if it exists. 
function Get-Directory { 
    param($item) 

if ($ParamSetName -eq "Path") { 
    if (Test-Path -Path $item -PathType Container) { 
    $item = Get-Item -Path $item -Force 
    } 
} 
elseif ($ParamSetName -eq "LiteralPath") { 
    if (Test-Path -LiteralPath $item -PathType Container) { 
    $item = Get-Item -LiteralPath $item -Force 
    } 
} 
    if ($item -and ($item -is [System.IO.DirectoryInfo])) { 
    return $item 
    } 

}

# Filter that outputs the custom object with formatted numbers. 
function Format-Output { 
    process { 
    $_ | Select-Object Path, 
     @{Name="Files"; Expression={"{0:N0}" -f $_.Files}}, 
     @{Name="Size"; Expression={"{0:N0}" -f $_.Size}} 
     } 
    } 

# Outputs directory statistics for the specified directory. With -recurse, 
# the function includes files in all subdirectories of the specified 
# directory. With -format, numbers in the output objects are formatted with 
# the Format-Output filter. 
function Get-DirectoryStats { 
    param($directory, $recurse, $format) 

    Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading 
'$($directory.FullName)'" 
    $files = $directory | Get-ChildItem -Force -Recurse:$recurse | Where- 
    Object 
    { -not $_.PSIsContainer } 
    if ($files) { 
    Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating 
    '$($directory.FullName)'" 
    $output = $files | Measure-Object -Sum -Property Length | Select-Object 
    ` 
    @{Name="Path"; Expression={$directory.FullName}}, 
    @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}}, 
    @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}} 
    } 
    else { 
     $output = "" | Select-Object ` 
     @{Name="Path"; Expression={$directory.FullName}}, 
     @{Name="Files"; Expression={0}}, 
     @{Name="Size"; Expression={0}} 
     } 
    if (-not $format) { $output } else { $output | Format-Output } 
    } 
    } 

... the rest of the code did not seem relevant 
+0

Was meinst du "Variable, die ich ändern muss, um einen anderen Pfad angeben"? Du änderst nichts. Sie führen das Skript aus und übergeben den Pfad als Parameter: '. \ Get-DirStats.ps1 -Pfad" C: \ some \ folder "'. –

Antwort

1

Sie entweder den $Path Variable, wenn das Skript aufrufen, oder fügen Sie eine Zeile, die den Standardwert überschreibt. Ich habe hervorgehoben, wo das unten ist.

[CmdletBinding(DefaultParameterSetName="Path")] 
param( 

[parameter(Position=0,Mandatory=$false,ParameterSetName="Path",ValueFromPipeline =$true)] 

    $Path=(get-location).Path, ################ PATH IS SET HERE ############## 
    [parameter(Position=0,Mandatory=$true,ParameterSetName="LiteralPath")] 
    [String[]] $LiteralPath, 
    [Switch] $Only, 

Wenn Skript Aufruf:

C:>.\myscript.ps1 -Path "c:\temp" 
0

, was Sie den Wert nennen hängt davon ab, wo Sie es nennen. Der Hauptteil dieses Cmdlets akzeptiert einen von mehreren Parametern. Pfad und LiteralPfad, Pfad wird dem Literalpfad vorgezogen. Wenn keine angegeben ist, ist das aktuelle Arbeitsverzeichnis der Ausgangspunkt. Das Übergeben verschiedener Argumente an das Cmdlet scheint die einfachste Methode zu sein. Die beabsichtigte Verwendung des Autors.

ABER ... In dieser ersten Funktion, nachdem die Parameter in der "Begin" -Abschnitt gebunden sind ... ist der tatsächliche Pfad "$ Element".

innerhalb Get-DirectoryStats wird es als $ Verzeichnis bezeichnet.

Es gibt Orte, wo es als $ _ bezeichnet wird.

Es gibt viele Artikel zum Thema "Scope". Hier ist eine: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_scopes