我正在使用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/
有人可以帮我解决上面的正则表达式吗?非常感谢!
答案 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,:?\\
表示“\可选地前面加:”。我们用正斜杠替换它。
这应该适用于绝大多数非病理性病例。但是,它不是防弹的。带有斜杠或冒号的疯狂文件名可能很容易破坏它。