第一个脚本从目录的用户那里获取输入:例如: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
更新答案
根据评论,作者想要实现的是获取字符串格式的选定目录,但由于他们选择的函数,目录最终以表格格式显示,从而使问题复杂化。以下是两个脚本
- 您可以使用从中获取两个目录
FolderBrowserDialog
并将它们保存到文本文件中。 - 您可以使用它从文本文件中获取目录并打印到控制台。
脚本 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]
可以正确打印出来(标题将始终显示在这里)。