Powershell 文件数据库与驱动器号变量输入的比较

Powershell File database comparison with drive letter variable input

我正在构建一个工具来扫描我的文件和朋友的文件。我们将使用它来确保我们的数据库中有相同的文件。到目前为止,我的脚本存在可变输入问题。出于某种原因,PowerShell 脚本在我输入驱动器号时失败。有人有什么想法吗?

这是我的脚本:

{
    function Show-Menu {
        param (
            [string] $Title  = "Andy's Manual Database Tool"
        )

        Clear-Host
        Write-Host ""
        Write-Host "================ $Title ================"
        Write-Host ""
        Write-Host -f Green "1. Andys Files listing"
        Write-Host -f green "2. Reids files listing"
        Write-Host -f Red "3. Dark Matter Testing"
        Write-Host "4. Convert .txt to .csv"
        Write-Host "5. Convert Blank File to .csv"
        Write-Host "6. Convert .csv to .txt"
    }

    Function Body {
        Show-Menu

        Write-Host ""

        $Input = Read-Host "Please make a selection"

        if ($Input -eq "1") {
            Clear-Host

            $root = Read-Host -Prompt 'Specify the location of Database? Example format: C:\*'
            $y = read-host -Prompt 'Input file types. Format Example: " .jpg,.mp4,.mp3,.pdf .... " Do * for all'
            $z = Read-Host -Prompt 'Your Save file name will be? Examples: Movies database , Music database , audiobooks.' 
            Get-ChildItem -Path $root -File -Recurse *.$y  | Select-Object -Property Name | Export-Csv -NoTypeInformation $z Andy.csv
        }

        if ($Input -eq "2") {
            Clear-Host

            $root = Read-Host -Prompt 'Specify the location of Database? Example format: C:\*'
            $y = read-host -Prompt 'Input file types. File Format Examples: " .jpg,.mp4,.mp3,.pdf .... " Do * for all'
            $z = Read-Host -Prompt 'Your Save file name will be? Examples: Movies database , Music database , audiobooks.' 
            Get-ChildItem -Path $root -File -Recurse *.$y  | Select-Object -Property Name | Export-Csv -NoTypeInformation $z' From Reid.csv'
        }

        if ($Input -eq "3") { Get-Process | Stop-Process }

        if ($Input -eq "4") {
            Clear-Host
            Get-ChildItem *.txt  | rename-item -newname {  $_.name  -replace ".txt",".csv" }
        }

        if ($Input -eq "5") {
            Clear-Host 
            Get-ChildItem * -Exclude *.ps1,*.CSV,*.TXT | rename-item -newname {  "$($_.name).CSV" }
        }

        if ($Input -eq "6") {
            Clear-Host
            Get-ChildItem *.csv  | rename-item -newname {  $_.name  -replace ".csv",".txt" }
        }

        Write-Host  'Complete! ^_^'

        Start-Sleep -seconds 5

        Body
    }
    Body
}

这个问题在这里,来自上面的脚本:

$root = Read-Host -Prompt 'Specify the location of Database? Example format: C:\*'
$y = read-host -Prompt 'Input file types. Format Example: " .jpg,.mp4,.mp3,.pdf .... " Do * for all'
$z = Read-Host -Prompt 'Your Save file name will be? Examples: Movies database , Music database , audiobooks.' 
Get-ChildItem -Path $root -File -Recurse *.$y  |
  Select-Object -Property Name |
  Export-Csv -NoTypeInformation $z Andy.csv

我正在使用 $root 作为驱动器号或位置路径的输入,这是问题所在。

有几个小问题。

  1. $z Andy.csv需要改为"$z Andy.csv"。当您 运行 收到以下消息之前,您会注意到:

Export-Csv : Cannot bind parameter 'Delimiter'. Cannot convert value "Andy.csv" to type "System.Char". Error: "String must be exactly one character long."

  1. Get-ChildItem -Path $root -File -Recurse *.$y 需要更改为 Get-ChildItem -Path "$root" -Recurse -Include "*$y" - 您提示用户输入带有 .<extension> 的文件扩展名(分配给 $y ) 那么您正在尝试使用 $y

    进行过滤

    例如:$y = read-host -Prompt 'Input file types. Format Example: " .jpg,.mp4,.mp3,.pdf .... " Do * for all'

    问题:"*.$y" 这等于“..extension”。你的结果将是 0(除非你有一个带有 ..jpg 或类似内容的文件)

更正:

if ($Input -eq "1") {
            Clear-Host

            $root = Read-Host -Prompt 'Specify the location of Database? Example format: C:\*'
            $y = read-host -Prompt 'Input file types. Format Example: " .jpg,.mp4,.mp3,.pdf .... " Do * for all'
            $z = Read-Host -Prompt 'Your Save file name will be? Examples: Movies database , Music database , audiobooks.'             
            Get-ChildItem -Path "$root" -Recurse -Include "*$y" | Select Name | Export-Csv -NoTypeInformation "$z Andy.csv"
        }

您应该能够按照 "Corrected" 示例更正脚本的其余部分。

编辑:

归功于 TheIncredible1

automatic variables 绝不能用于非预期用途。在你的情况下 $Input:

Contains an enumerator that enumerates all input that is passed to a function. The $input variable is available only to functions and script blocks (which are unnamed functions). In the Process block of a function, the $input variable enumerates the object that is currently in the pipeline. When the Process block completes, there are no objects left in the pipeline, so the $input variable enumerates an empty collection. If the function does not have a Process block, then in the End block, the $input variable enumerates the collection of all input to the function.

但是,在这种情况下,它不会影响您的结果。但是,这是一个非常糟糕的习惯,最好避免。