Powershell 如何将文件夹移动到名称为要移动的文件夹的第一个字符的子文件夹中,并在文件夹名称中支持Unicode字符?

Powershell 如何将文件夹移动到名称为要移动的文件夹的第一个字符的子文件夹中,并在文件夹名称中支持Unicode字符?,powershell,Powershell,我使用这个write by将文件夹移动到其他文件夹中 @echo关闭 setlocal EnableExtensions DisableDelayedExpansion %SystemRoot%\System32\tree.com 对于/F“eol=| delims=“%%I in('dir/AD/b2^>nul'),请执行以下操作( 设置“FolderName=%%I” setlocal EnableDelayedExpansion 设置“TargetFolder=!FolderName:~0

我使用这个write by将文件夹移动到其他文件夹中

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\tree.com
对于/F“eol=| delims=“%%I in('dir/AD/b2^>nul'),请执行以下操作(
设置“FolderName=%%I”
setlocal EnableDelayedExpansion
设置“TargetFolder=!FolderName:~0,1!”
如果不是“!TargetFolder!”==”!FolderName!”(
md“!TargetFolder!”2>nul
移动/-Y“!FolderName!”!TargetFolder!\”
)
端部
)
%SystemRoot%\System32\tree.com
端部
它会将当前文件夹中包含两个或多个字符的文件夹移动到子文件夹中,其中名称是要移动的文件夹的第一个字符,并自动创建目标文件夹(如果尚未存在)

但是,如果文件夹名称包含一个或多个Unicode字符,则批处理脚本不起作用

PowerShell是否有解决方案


例如,它不会将第一个字符为
(西里尔字母大写SHA)的文件夹移动到名为

的文件夹中。是的,PowerShell正确处理文件路径中的Unicode字符(通常)

PowerShell中批处理文件代码的等效代码为:

Get-ChildItem -Directory -Path ??* |
  Move-Item -Destination { 
    # Determine the target dir - the input dir's first letter -
    # ensure that it exists, and output it.
    New-Item -Type Directory -Force (Join-Path $_.Parent.FullName $_.Name[0])
  } -WhatIf
注意:上面命令中的预览将预览移动操作。一旦确定操作将执行所需操作,请删除
-WhatIf
。但是,即使使用
-WhatIf
立即创建目标目录

  • -Directory-Path???*
    获取名称至少由2个字符组成的所有目录

    • 兼容性说明:正如问题中批处理文件代码的原始作者所指出的,
      -Directory
      开关需要PowerShell版本3或更高版本,并且要使代码在v2中工作,
      getchilditem-Path???*|其中必须使用对象{$\ux.PSIsContainer}
  • 该命令使用确定每个输入目录的目标目录:

    • -Type Directory
      创建目标目录,或者-Force返回现有目录。在这两种情况下,都会输出一个实例,告诉
      Move Item
      将输入目录移动到哪里。就在眼前

    • 确定输入目录自己的(父)目录的完整目标路径,
      $\uu.parent.FullName
      [1],以及输入目录名目标名的第一个字母,
      $\uName[0]

      • 注意:如果您在当前目录中运行命令,则严格来说不需要构建完整的目标路径,因此在这种情况下,您可以简化为
        newitem-Type目录-Force$\.Name[0]


[1] 您也可以使用
$\u.PSParentPath
,但是,由于7.1版本的PowerShell[Core]中的
连接路径中存在错误,这在类似Unix的平台上不起作用-请参阅。

PowerShell脚本在PowerShell 3.0或更新版本中运行良好。根据感谢您将我的批处理代码重写为PowerShell脚本代码。谢谢您的确认,@Mofi。我在答案中添加了v2解决方案(幸运的是,v2安装越来越少)。我还添加了一条注释,指出是您编写了批处理文件代码,OP应该在问题中这样做。(我已经用批处理文件代码a+1给出了您的原始答案)非常感谢,@JackRock。