批处理或PowerShell:如何从字符串中获取最后一个单词?

时间:2014-02-26 01:35:39

标签: string batch-file powershell powershell-v2.0 batch-processing

以下是我的情景:

我有一个包含很多行的文本文件。每一行都是文件夹的路径。

示例:000.txt

 C:\Program Files (x86)\Microsoft Office\Office15
 C:\Program Files (x86)\Common Files\Adobe\Acrobat
 C:\Program Files (x86)\Common Files\Blizzard Entertainment

我需要找到一种方法来获取每行的最后一个子文件夹的名称,并使用它来创建文件夹链接:

d:\>mklink /j office15 "C:\Program Files (x86)\Microsoft Office\Office15"
d:\>mklink /j acrobat "C:\Program Files (x86)\Common Files\Adobe\Acrobat"
d:\>mklink /j "Blizzard Entertainment" "C:\Program Files (x86)\Common Files\Blizzard Entertainment"

我试过这个:

$a="C:\Program Files (x86)\Microsoft Office\Office15"
$a.Split()[-1]

结果:

Office\Office15

我也尝试过:

$a.Split("`t",[System.StringSplitOptions]::RemoveEmptyEntries)[-1]

结果是:

5

如何使用Batch或PowerShell在最后\之后获取每行或每个单词的最后一个单词?

5 个答案:

答案 0 :(得分:7)

我认为这些文件夹都已经存在,如果是这样,有一种完全不同的方式可以考虑:

Get-Content "000.txt" | Get-Item | foreach-object {
    cmd /c mklink /J $_.Name $_.FullName
}

因此,对于每个文件夹名称,您将获得与该文件夹关联的DirectoryInfo对象。然后,您可以直接从Name属性中提取路径的最后部分。

这样做的另一个好处是,如果在尝试链接到目标文件夹之前不存在任何目标文件夹,则会收到错误。

答案 1 :(得分:6)

你很接近,但是忘了指定要拆分字符串的字符,所以它默认为空格:

 $a="C:\Program Files (x86)\Microsoft Office\Office15"
 $a.Split('\')[-1]

答案 2 :(得分:4)

以下是批处理

的另一种简单方法
@echo off
for /f "delims=" %%a in (000.txt) do (
  mklink /j "%%~na" "%%~fa"
)

答案 3 :(得分:1)

使用批处理 - 查看for命令和字符串操作。您可以执行以下操作 -

@echo off
setLocal enableDelayedExpansion
for /f "delims=" %%a in (000.txt) do (
    set dir=%%a
    set dir=!dir: =/!
    set dir=!dir:\= !
    for %%b in (!dir!) do set ldir=%%b
    echo !ldir:/= !
    mklink /j "!ldir:/= !" "%%a"
)

这个脚本循环遍历文本文档(我已经使用了000.txt,可以将其更改为变量),每次将变量dir设置为当前行,我们假设是目录路径。然后通过用/(目录名称不能包含的字符)替换所有空格和所有{{ 1}}带空格的字符(这样每个目录名之间现在有一个空格)。然后,for循环将变量\设置为最后一个目录名。

答案 4 :(得分:0)

PowerShell有一个专用工具,用于将路径拆分为父路径(目录前缀)或叶子组件(文件名/目录名称):Split-Path

Split-Path -Leaf仅返回最后一个路径组件,这将启用以下解决方案:

Get-Content 000.txt | ForEach-Object { cmd /c mklink /j (Split-Path -Leaf $_) $_ }

请注意需要使用cmd /c,因为mklinkcmd.exe内部的命令。