如何在 PowerShell 中将目录导出和导入为变量

如何在 PowerShell 中将目录导出和导入为变量

第一个脚本从目录的用户那里获取输入:例如:D:\Test1 D:\Test2

$Dir1=Read-Host -Prompt "Enter first location" |Out-file -FilePath .\directories.csv -Append
    $Dir2=Read-Host -Prompt "Enter 2nd location (or leave blank)" |Out-file -FilePath .\directories.csv -Append

在第二个脚本中我有:

$Dir=Import-Csv 'D:\directories.csv'
$Dir[0]

但它不能正确打印(打印所有目录而不是只打印一个目录)我需要将每个目录分配给不同的变量

PS 这里完全是初学者所以请简单解释一下

答案1

以下是我的看法:

循环提示路径并收集到数组中,直到没有条目:

$DirPaths = @()
Do {
    $DirPaths += Read-Host -Prompt "Enter path (leave blank to end)" 
} Until ($DirPaths[-1] -eq '')

将除空字符串之外的所有元素保存到文本文件:

$DirPaths.Where({ $_ -eq '' }, 'Until') | Set-Content .\DirPaths.txt

每行只有一个元素且没有标题行,因此不需要 .csv

用于Get-Content以路径数组的形式检索文件

$Dir = Get-Content .\DirPaths.txt

然后,您可以获得路径数并单独访问,如下所示:

$Dir.Count
$Dir[0]

例子:

>$DirPaths = @()
>> Do {
>>     $DirPaths += Read-Host -Prompt "Enter path (leave blank to end)"
>> } Until ($DirPaths[-1] -eq '')
Enter path (leave blank to end): Path1
Enter path (leave blank to end): Path2
Enter path (leave blank to end): Path3
Enter path (leave blank to end):
PS C:\...\Sandbox>$DirPaths.Where({ $_ -eq '' }, 'Until') | Set-Content .\DirPaths.txt
PS C:\...\Sandbox>$Dir = Get-Content .\DirPaths.txt                                     PS C:\...\Sandbox>$Dir.Count
3
PS C:\...\Sandbox>$Dir[0]
Path1
PS C:\...\Sandbox>

编辑:

本代码使用如下BrowseForFolder方法:

$Shell = New-Object -ComObject shell.application
$Folders = @()
Do {
    $Folders += $Shell.BrowseForFolder( 0, 'Prompt', 0, 17 )
} Until ( $Null -eq $Folders[-1] )

$Folders.Self.Path | Set-Content .\DirPaths.txt

在此处输入图片描述

答案2

更新答案

根据评论,作者想要实现的是获取字符串格式的选定目录,但由于他们选择的函数,目录最终以表格格式显示,从而使问题复杂化。以下是两个脚本

  1. 您可以使用从中获取两个目录FolderBrowserDialog并将它们保存到文本文件中。
  2. 您可以使用它从文本文件中获取目录并打印到控制台。

脚本 1

#function for the directory selection dialog
Function Get-Folder($initialDirectory="")
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.Description = "Select a folder"
    $foldername.rootfolder = "MyComputer"
    $foldername.SelectedPath = $initialDirectory

    if($foldername.ShowDialog() -eq "OK")
    {
        $folder += $foldername.SelectedPath
    }
    return $folder
}

#call open dialog twice
for($i=1; $i -le 2; $i++){
    $a = Get-Folder
    $a | out-file -append directory.txt
}

脚本 2

#print each directory into the console
foreach($line in Get-Content .\directory.txt) {
    $line
}

旧答案

Import-Csv 假设您的 csv 文件的第一行是标题,因此在本例中D:\Test1假设为标题。由于您的文件缺少标题,您可以手动输入标题以避免该问题。

$Dir=Import-Csv 'D:\directories.csv' -Header "DummyHeader"

现在$Dir[0]可以正确打印出来(标题将始终显示在这里)。

相关内容