Fix LiteralPath in Import-Csv to bind to Get-ChildItem output (#8277)
Added new tests.
This commit is contained in:
parent
73716e9792
commit
6647b29f41
|
@ -509,7 +509,7 @@ namespace Microsoft.PowerShell.Commands
|
|||
/// <summary>
|
||||
/// Implements Import-Csv command.
|
||||
/// </summary>
|
||||
[Cmdlet(VerbsData.Import, "Csv", DefaultParameterSetName = "Delimiter", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113341")]
|
||||
[Cmdlet(VerbsData.Import, "Csv", DefaultParameterSetName = "DelimiterPath", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113341")]
|
||||
public sealed
|
||||
class
|
||||
ImportCsvCommand : PSCmdlet
|
||||
|
@ -519,14 +519,16 @@ namespace Microsoft.PowerShell.Commands
|
|||
/// <summary>
|
||||
/// Property that sets delimiter.
|
||||
/// </summary>
|
||||
[Parameter(Position = 1, ParameterSetName = "Delimiter")]
|
||||
[Parameter(Position = 1, ParameterSetName = "DelimiterPath")]
|
||||
[Parameter(Position = 1, ParameterSetName = "DelimiterLiteralPath")]
|
||||
[ValidateNotNull]
|
||||
public char Delimiter { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Mandatory file name to read from.
|
||||
/// </summary>
|
||||
[Parameter(Position = 0, ValueFromPipeline = true)]
|
||||
[Parameter(Position = 0, ParameterSetName = "DelimiterPath", Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
|
||||
[Parameter(Position = 0, ParameterSetName = "CulturePath", Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
|
||||
[ValidateNotNullOrEmpty]
|
||||
public string[] Path
|
||||
{
|
||||
|
@ -548,7 +550,8 @@ namespace Microsoft.PowerShell.Commands
|
|||
/// <summary>
|
||||
/// The literal path of the mandatory file name to read from.
|
||||
/// </summary>
|
||||
[Parameter(ValueFromPipelineByPropertyName = true)]
|
||||
[Parameter(ParameterSetName = "DelimiterLiteralPath", Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
||||
[Parameter(ParameterSetName = "CultureLiteralPath", Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
||||
[ValidateNotNullOrEmpty]
|
||||
[Alias("PSPath", "LP")]
|
||||
[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
|
||||
|
@ -571,7 +574,8 @@ namespace Microsoft.PowerShell.Commands
|
|||
/// <summary>
|
||||
/// Property that sets UseCulture parameter.
|
||||
/// </summary>
|
||||
[Parameter(ParameterSetName = "UseCulture", Mandatory = true)]
|
||||
[Parameter(ParameterSetName = "CulturePath", Mandatory = true)]
|
||||
[Parameter(ParameterSetName = "CultureLiteralPath", Mandatory = true)]
|
||||
[ValidateNotNull]
|
||||
public SwitchParameter UseCulture
|
||||
{
|
||||
|
@ -664,7 +668,7 @@ namespace Microsoft.PowerShell.Commands
|
|||
/// <summary>
|
||||
/// Implements ConvertTo-Csv command.
|
||||
/// </summary>
|
||||
[Cmdlet(VerbsData.ConvertTo, "Csv", DefaultParameterSetName = "Delimiter",
|
||||
[Cmdlet(VerbsData.ConvertTo, "Csv", DefaultParameterSetName = "DelimiterPath",
|
||||
HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135203", RemotingCapability = RemotingCapability.None)]
|
||||
[OutputType(typeof(string))]
|
||||
public sealed class ConvertToCsvCommand : BaseCsvWritingCommand
|
||||
|
@ -754,7 +758,7 @@ namespace Microsoft.PowerShell.Commands
|
|||
/// <summary>
|
||||
/// Implements ConvertFrom-Csv command.
|
||||
/// </summary>
|
||||
[Cmdlet(VerbsData.ConvertFrom, "Csv", DefaultParameterSetName = "Delimiter",
|
||||
[Cmdlet(VerbsData.ConvertFrom, "Csv", DefaultParameterSetName = "DelimiterPath",
|
||||
HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135201", RemotingCapability = RemotingCapability.None)]
|
||||
public sealed
|
||||
class
|
||||
|
@ -765,7 +769,7 @@ namespace Microsoft.PowerShell.Commands
|
|||
/// <summary>
|
||||
/// Property that sets delimiter.
|
||||
/// </summary>
|
||||
[Parameter(Position = 1, ParameterSetName = "Delimiter")]
|
||||
[Parameter(Position = 1, ParameterSetName = "DelimiterPath")]
|
||||
[ValidateNotNull]
|
||||
[ValidateNotNullOrEmpty]
|
||||
public char Delimiter { get; set; }
|
||||
|
@ -773,7 +777,8 @@ namespace Microsoft.PowerShell.Commands
|
|||
///<summary>
|
||||
///Culture switch for csv conversion
|
||||
///</summary>
|
||||
[Parameter(ParameterSetName = "UseCulture", Mandatory = true)]
|
||||
[Parameter(ParameterSetName = "CulturePath", Mandatory = true)]
|
||||
[Parameter(ParameterSetName = "CultureLiteralPath", Mandatory = true)]
|
||||
[ValidateNotNull]
|
||||
[ValidateNotNullOrEmpty]
|
||||
public SwitchParameter UseCulture { get; set; }
|
||||
|
@ -1702,6 +1707,8 @@ namespace Microsoft.PowerShell.Commands
|
|||
switch (ParameterSetName)
|
||||
{
|
||||
case "Delimiter":
|
||||
case "DelimiterPath":
|
||||
case "DelimiterLiteralPath":
|
||||
// if delimiter is not given, it should take , as value
|
||||
if (Delimiter == '\0')
|
||||
{
|
||||
|
@ -1710,6 +1717,8 @@ namespace Microsoft.PowerShell.Commands
|
|||
|
||||
break;
|
||||
case "UseCulture":
|
||||
case "CulturePath":
|
||||
case "CultureLiteralPath":
|
||||
if (UseCulture == true)
|
||||
{
|
||||
// ListSeparator is apparently always a character even though the property returns a string, checked via:
|
||||
|
|
|
@ -41,16 +41,50 @@ Describe "Import-Csv Double Quote Delimiter" -Tags "CI" {
|
|||
}
|
||||
|
||||
|
||||
It "Should handle <name>" -TestCases @(
|
||||
It "Should handle <name> and bind to LiteralPath from pipeline" -TestCases @(
|
||||
@{ name = "quote with empty value" ; expectedHeader = "a1,H1,a3"; file = "EmptyValue.csv" ; content = $empyValueCsv ; delimiter = '"' }
|
||||
@{ name = "quote with value" ; expectedHeader = "a1,a2,a3"; file = "WithValue.csv" ; content = $withValueCsv ; delimiter = '"' }
|
||||
@{ name = "value enclosed in quote" ; expectedHeader = "a1,a2,a3"; file = "QuotedCharacter.csv" ; content = $quotedCharacterCsv ; delimiter = ',' }
|
||||
){
|
||||
param($expectedHeader, $file, $content, $delimiter)
|
||||
Set-Content testdrive:/$file -Value $content
|
||||
$returnObject = Import-Csv -Path testdrive:/$file -Delimiter $delimiter
|
||||
|
||||
$testPath = Join-Path $TestDrive $file
|
||||
Set-Content $testPath -Value $content
|
||||
|
||||
$returnObject = Get-ChildItem -Path $testPath | Import-Csv -Delimiter $delimiter
|
||||
$actualHeader = $returnObject[0].psobject.Properties.name -join ','
|
||||
$actualHeader | Should -Be $expectedHeader
|
||||
$actualHeader | Should -BeExactly $expectedHeader
|
||||
|
||||
$returnObject = $testPath | Import-Csv -Delimiter $delimiter
|
||||
$actualHeader = $returnObject[0].psobject.Properties.name -join ','
|
||||
$actualHeader | Should -BeExactly $expectedHeader
|
||||
|
||||
$returnObject = [pscustomobject]@{ LiteralPath = $testPath } | Import-Csv -Delimiter $delimiter
|
||||
$actualHeader = $returnObject[0].psobject.Properties.name -join ','
|
||||
$actualHeader | Should -BeExactly $expectedHeader
|
||||
}
|
||||
|
||||
It "Should handle <name> and bind to Path from pipeline" -TestCases @(
|
||||
@{ name = "quote with empty value" ; expectedHeader = "a1,H1,a3"; file = "EmptyValue.csv" ; content = $empyValueCsv ; delimiter = '"' }
|
||||
@{ name = "quote with value" ; expectedHeader = "a1,a2,a3"; file = "WithValue.csv" ; content = $withValueCsv ; delimiter = '"' }
|
||||
@{ name = "value enclosed in quote" ; expectedHeader = "a1,a2,a3"; file = "QuotedCharacter.csv" ; content = $quotedCharacterCsv ; delimiter = ',' }
|
||||
){
|
||||
param($expectedHeader, $file, $content, $delimiter)
|
||||
|
||||
$testPath = Join-Path $TestDrive $file
|
||||
Set-Content $testPath -Value $content
|
||||
|
||||
$returnObject = Get-ChildItem -Path $testPath | Import-Csv -Delimiter $delimiter
|
||||
$actualHeader = $returnObject[0].psobject.Properties.name -join ','
|
||||
$actualHeader | Should -BeExactly $expectedHeader
|
||||
|
||||
$returnObject = $testPath | Import-Csv -Delimiter $delimiter
|
||||
$actualHeader = $returnObject[0].psobject.Properties.name -join ','
|
||||
$actualHeader | Should -BeExactly $expectedHeader
|
||||
|
||||
$returnObject = [pscustomobject]@{ Path = $testPath } | Import-Csv -Delimiter $delimiter
|
||||
$actualHeader = $returnObject[0].psobject.Properties.name -join ','
|
||||
$actualHeader | Should -BeExactly $expectedHeader
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue