我有一个应用程序,我从git status获取新的\ modified文件列表,然后我从该文件中获取不完整的字符串,将它们与根目录文件路径连接起来,然后将这些文件移动到存档。我有一半的工作,但我使用PowerShell的性质不提供错误报告,这个过程显然是错误的。这是我试图使用的代码。 (它经历了几次迭代,请原谅注释掉的部分)基本上我试图从txt文件中获取内容,然后替换?用\(由于某种原因创建txt的过程爱前进斜线...),然后在空格处分割该字符串。我感兴趣的字符串的唯一部分是最后一部分,我试图与已知的工作根目录连接,然后我试图将它们移动到存档位置。在你问之前,由于文件的性质,这是我们不愿意在git中跟踪的东西(它们是带有时间戳的测试输出,我们希望在每次测试运行的基础上保存它们,而不是在git中)我仍然相当新的PowerShell,并且长期以来一直在撞击这块岩石。
Get-Content $outfile | Foreach-Object
{
#$_.Replace("/","\")
#$lineSplit = $_.Split(' ')
$_.Split(" ")
$filePath = "$repo_dir\$_[-1]"
$filePath.Replace('/','\')
"File Path Created: $filePath"
$untrackedLegacyTestFiles += $filePath
}
Get-Content $untrackedLegacyTestFiles | Foreach-Object
{
Copy-Item $_ $target_root -force
"Copying File: $_ to $target_root"
}
}
!! Some/File/Path/Doc.txt
“!!”卑鄙的git将它视为一个新文件,但它可能是从“M”到“??”的几个字符。这就是为什么我试图将它分割成空格并仅采用最后一个元素。 我想要的输出是从$ outfile(Some / File / Path / Doc.txt)获取split字符串的最后一个元素,并将其与$ repo_dir连接以形成一个完整的文件路径,然后移动Doc.txt到存档位置($ target_root)。
答案 0 :(得分:1)
要在PowerShell中组合路径,您应该使用Join-Path cmdlet。要从字符串中提取路径,可以使用regex
:
$extractedPath = [regex]::Match('!! Some/File/Path/Doc.txt', '.*\s(.+)$').Groups[1].Value
$filePath = Join-Path $repo_dir $extractedPath
Join-Path
cmldet还会将所有正斜杠转换为反斜杠,因此无需替换它们: - )。
您的整个脚本可能如下所示:
Get-Content $outfile | Foreach-Object {
$path = Join-Path $repo_dir ([regex]::Match($_, '.*\s(.+)$').Groups[1].Value)
Copy-Item $path $target_root -force
}
如果您不想在代码中使用regex
,也可以使用以下方式提取路径:
$extractedPath = '!! Some/File/Path/Doc.txt' -split ' ' | select -Last 1
或
$extractedPath = ('!! Some/File/Path/Doc.txt' -split ' ')[-1]