2016-11-26 137 views
0

我想编写一个简单的Powershell脚本,它将2个正则表达式作为参数,并重命名文件夹中的文件。这里是myscript.ps1:如何使用Powershell参数作为正则表达式来重命名文件?

echo $args[0] 
echo $args[1] 
Get-ChildItem 
Get-ChildItem | Rename-Item -NewName {$_.Name -replace $args[0], $args[1]} 
"foo" -replace $args[0], $args[1] 

我打电话从myscript.cmd

@echo off 
powershell -Command %~dpn0.ps1 %1 %2 

这个剧本,当我从CMD执行myscript foo bar,我得到的输出

foo 
bar 
Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  26.11.2016  15:24   16 foo 
bar 

但我的测试我创建的文件foo未被重命名。

我的问题:

  • 我是否正确调用PowerShell脚本,并传递参数以正确的方式?我想我需要在%1,%2参数周围引用一些引号。
  • 为什么文件没有被重命名,尽管-replace似乎工作?
+1

故障诊断建议:'echo $ PWD' –

回答

0

我看到你的想法有问题,你不过滤的文件和正则表达式不适合使用通配符,所以得到一个名为foo文件的正则表达式应该像^foo$,如果你想与一个扩展匹配文件名,它的^foo\.txt$

$From = [RegEx]($Args[0]) 
$To = [RegEx]($Args[1]) 
Get-ChildItem -file| 
    %{if ($_.Name -match $From) { 
    Rename-Item $_.Fullname -NewName $To 
    } 
} 

此脚本通过铸造$不重命名参数数量[0]对正则表达式时,调用此方式:

.\Rename-RegEx.ps1 "^foo$" bar 
-1

我不知道为什么,但你可以做到这一点

$arg0=$args[0] 
$arg1=$args[1] 

Get-ChildItem | Rename-Item -NewName {$_.Name -replace $arg0, $arg1} 
+0

但是这也会重命名为foobar。 – LotPings

相关问题