powershell 将文档复制到文件夹中,然后使用部分文件夹名称对其进行重命名

ugmeyewa  于 2022-11-10  发布在  Shell
关注(0)|答案(1)|浏览(243)

我在Windows中有一大组文件夹,命名如下:

**Firstname Lastname_xxxxxxx_**其中xxxxxxx为数字ID。

所有这些子文件夹都位于名为“T:\Tests2022”的文件夹中。
这些目录如下所示:
约翰·史密斯_12345678_
玛丽·斯科特_87945687_
威廉·泰尔_9875348_
无名氏_57982388_
例如,完整路径为T:\Tests2022\John Smith_12345678_
我有一个文档“testscript.txt”,我想将其移动到每个文件夹中。该文件也位于“Tests2022”的根目录中(即T:\Tests2022\testscript.txt)
但是,我想在文件前面加上“FirstName_”。(例如,在第一个文件夹中,该文件将被命名为“T:\Tests2022\John Smith_12345678_\John_Testscript.txt”)。
理想情况下,如果世界是完美的,则该文件将命名为“John Smith_tescript.txt”)
只需在cmd行中移动文件就很容易:“Moveit.bat”包含

for /D %%a in (".\*.*") do xcopy /y /d ".\testscript.txt" "%%a\"

我可以手动执行此操作,但我必须每两周对不同的测试目录列表执行一次类似的操作,这样宏将是理想的。
我需要帮助将其移动到PowerShell,然后使用PowerShell来解析和收集文本到第一个空格(名字/姓氏对之间)或第一个下划线。

ukxgm1gy

ukxgm1gy1#

内联注解应该有助于理解其中的逻辑。如果您想学习一些新知识,您应该亲自查看脚本中使用的命令。
此链接https://regex101.com/r/h0SYVz/1应解释以下内容:

$_.Name -replace '(?<=_).+'
$targetFile = 'T:\Tests2022\testscript.txt'

# Enumerate all Directories in Test2022

Get-ChildItem T:\Tests2022\ -Directory | ForEach-Object {
    # if this Subdirectory has the `testscript.txt` in it
    if($_ | Get-ChildItem -Filter *testscript.txt) {
        # go to the next Directory, nothing to do here
        return
    }

    # if this Subdirectory doesn't have the file,
    # extract everything up until the underscore for the folder name
    # and concatenate with `testscript.txt`
    $name = ($_.Name -replace '(?<=_).+') + 'testscript.txt'
    # Join this folder's absolute path with the new file name
    $destination = Join-Path $_.FullName -ChildPath $name
    # now we can copy the `.txt` file into this folder
    Copy-Item $targetFile -Destination $destination
}

相关问题