Powershell:REGEX修改不同*框样式的路径

时间:2013-02-13 10:05:14

标签: regex powershell cygwin

我正在使用Rsync和ICACLS来同步两个(windows)目录,为此,我必须将相同的路径转换为几个“样式”:cygwin * nix,remote * nix,UNC。 (见下面的例子)

我正在使用以下代码来实现这一点,虽然它正常工作,但我正在使用的正则表达式肯定会更强大并且更好地工作(正如您所看到的,我正在替换替换,我觉得最好是丑陋......)

$remote="remotesrv"
$path="g:\tools\example\"
$local_dos=$path
$remote_dos="\\$remote\"+(($local_dos -replace "^\w","$&$") -replace "(:\\)|(\\)","\")
$local_nix="/cygdrive/"+($local_dos -replace "(:\\)|(\\)","/")
$remote_nix="//$remote/"+(($local_dos -replace "^\w","$&$") -replace "(:\\)|(\\)","/")
"Local DOS  : $local_dos"
"Remote DOS : $remote_dos"
"Local *nix : $local_nix"
"Remote *nix: $remote_nix"

输出是:

Local DOS  : g:\tools\example\
Remote DOS : \\remotesrv\g$\tools\example\
Local *nix : /cygdrive/g/tools/example/
Remote *nix: //remotesrv/g$/tools/example/

有人可以帮我解决上面的正则表达式吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

通常的做法是将路径拆分为其组成部分,翻译部件,然后重新组合目标操作系统的部件。对于Windows / Cygwin / DOS,组件部分为:

  • 驱动器
  • 路径
  • 文件名(大多数文件系统中第一个'。'之前的部分)
  • 文件扩展名(zim.tar.gz其中filename = zim和extension = .tar.gz

长期来说,这比尝试一次完成所有操作更容易,更快捷。 (我知道 - 我以前曾经一次尝试过。)

如果您可以阅读Perl代码,Perl的File::Spec模块可能值得一看。

答案 1 :(得分:0)

这个怎么样:

$local_dos  =  $path
$remote_dos = "\\$remote\$path" -replace ':', '$'
$local_nix  = "/cygdrive/$path" -replace ':?\\', '/'
$remote_nix = "//$remote/$path" -replace ':?\\', '/'

dos的非常简单,并没有真正使用正则表达式。

对于nix,:?\\表示“\可选地前面加:”。我们用正斜杠替换它。

这应该适用于绝大多数非病理性病例。但是,它不是防弹的。带有斜杠或冒号的疯狂文件名可能很容易破坏它。