0

我正在尝试检查一个目录是否存在,以及它是否用另一个目录中的更新文件替换了该目录中的所有文件。

$path = "C:\mypath\config"
if([System.IO.Directory]::Exists($path)){
    $files = Get-ChildItem -Path $path | Select-Object "Name"
    ForEach ($File in $files)
    {
        Copy-Item -Path "C:\tmp\$File" -Destination "$path\$File.txt"
    }
}

我不断收到 Copy-Item 命令的错误,因为 $File 返回 @{Name=filename} 而不仅仅是文件名。我尝试过使用 $File.name、$File.basename 等,但这些似乎都不起作用。如何让 Powershell 不将文件名包装在“@{Name=}”中?

4

2 回答 2

2

你几乎是对的,你只需要使用-ExpandProperty参数 for Select-Object

$files = Get-ChildItem -Path $path | Select-Object -ExpandProperty "Name"

这将为您提供一个字符串数组,这些字符串是文件的名称。

您之前拥有的是一组自定义对象,其中包含从文件信息对象复制的 Name 属性。

于 2019-03-07T19:57:44.557 回答
1

访问名称的另一种方法是直接引用 name 属性:

$files = (Get-ChildItem -Path $path).name
于 2019-03-07T20:01:22.543 回答