1

我有一个包含 3 列的 CSV 文件:名称、工作和目录。

我正在尝试让用户输入名称或作业,它将返回第 3 列(目录)的一行或多行输出

    $Profile = $PSScriptRoot + "\Profile.csv"
    $Data = Import-Csv -Path $Profile
    $JobChoice = Read-Host "Enter a Backup option"
    
$Results = $Data |  Where-Object {( $_.Name, $_.Job ) -eq [string]$JobChoice} 
     
$Results | Select-Object -ExpandProperty ($_.Directory)

上面的例子如果我在提示时输入:“satisfactory”,它只会显示一个返回。但它显示了所有三列我只需要它来返回当前行目录。

另外,如果我输入“SaveGame”作为读取主机输入。它将返回该作业的所有游戏,但仅返回目录。我想保留此功能,因为它会根据我选择名称或工作来接受一个或多个游戏

我什至尝试了以下每种组合:

Select-Object -ExpandProperty ($_.Directory)

我的目标是将数据添加到 CSV 然后解析它并将它们发送到 xcopy 以批量复制返回的目录。

有什么帮助吗?

CSV:

Name,Job,Directory
Satisfactory,Savegame,C:\Users\jrkid\AppData\Local\FactoryGame\Saved\SaveGames
TheLongDark,Savegame,C:\Users\jrkid\AppData\Local\Hinterland
TheInfected,Savegame,C:\Users\jrkid\AppData\Local\TheInfected
WrenchGame,Savegame,C:\Users\jrkid\AppData\Local\WrenchGame
Valheim,Savegame,C:\Users\jrkid\AppData\LocalLow\IronGate
RisingWorld,Savegame,C:\Users\jrkid\AppData\LocalLow\JIW-Games
7DTD,Savegame,C:\Users\jrkid\AppData\Roaming\7DaysToDie
4

3 回答 3

1

您可以使用以下语句,可以将其解读为:

属性属性值等于$csv 对象。然后,您可以按照该语句枚举该属性的所有值。 Name Job$JobChoice.DirectoryDirectory

有关详细信息,请参阅成员枚举

$csv = Import-Csv path/to/csv.csv
$JobChoice = Read-Host "Enter a Backup option"
$csv.Where({ $JobChoice -eq $_.Name -or $JobChoice -eq $_.Job }).Directory

回顾您的代码,您当前使用的语句也可以工作,但是-in或者-contains会更有效。

$csv.Where({ ($_.Name, $_.Job) -contains $JobChoice }).Directory

您的代码的唯一问题是使用($_.Directory),它应该只是:

| Select-Object -ExpandProperty Directory
于 2022-02-24T00:11:28.917 回答
0

你只是想要目录作为输出吗?将 Select-Object 替换为 ForEach-Object 并使用 {} 而不是 ()

$Results | ForEach-Object { $_.Directory}
于 2022-02-24T00:20:57.017 回答
0

这段代码是我需要的解决方案。

$csv.Where({ ($_.Name, $_.Job) -contains $JobChoice }).Directory

这允许我从 CSV 文件中提取管道目录。下面是工作脚本。

CSV

Name           Type     DirType    Directory                    
7DTD           Game      User     Roaming\7DaysToDie                    
ASXP        Application  User     Roaming\HiFi                  
BattleNet   Application  User     Local\Battle.net                  
CereProc    Application  User     Local\CereProc

                

变量

$global:Profile = $PSScriptRoot + "\Profile.csv"
$global:Data = Import-Csv -Path $global:Profile
$global:BackupPath = "E:\PowerShell Scripts\Automate Backup\MainFrameV2\Test1"
$global:LogFile = $PSScriptRoot + "\Log.txt"
$global:AppData = $env:USERPROFILE+"\AppData"
$global:ProgramFiles = $env:ProgramFiles
$global:ProgramFiles86 = $env:ProgramFiles+" (x86)"
$global:ProgramData = $env:ProgramData
$global:DateFormat = "(%m-%d-%Y)"
$global:cWaitTime = 2 # Retry copy wait time

$global:TypeChoice = Read-Host

使用工作代码的 Robocopy

$global:Data | Where({ ($global:TypeChoice -eq $_.Type -or $global:TypeChoice -eq $_.Name) -and $_.DirType -eq "USER"}) | ForEach  {                   
                            robocopy ($global:AppData+"\"+$_.Directory) ($global:BackupPath +"\"+$global:Time+"\"+($_.Type)+"\"+ ($_.Name))  /S /mt:8 /tee /eta /log+:$global:LogFile /xf "*.ccc" /w:$global:cWaitTime
                            trap { exit 8 }
于 2022-02-25T12:12:46.770 回答