批量+ powershell脚本重命名错误目录错误

时间:2014-03-23 07:41:50

标签: batch-file powershell

当我在目录中时,以下代码有效:

gci | % {rni $_.Name ($_.Name -replace '120', '121')}

如何创建一个包含powershell代码的批处理文件,该代码可以在每个目录中正常运行而不会出现错误。我只想启动file.bat,它将重命名file.bat所在的每个文件夹中的所有文件?

powershell -C "gci | % {rni $_.Name ($_.Name -replace '120', '121')}"

这不起作用,这是错误:

Expressions are only permitted as the first element of a pipeline. 
At line:1 char:52 + gci |  {rni $_.Name ($_.Name -replace '501', '121')} <<<<

2 个答案:

答案 0 :(得分:1)

你本可以更具体一点。我现在正在做出假设,试图解决你的问题 -

  1. 您想要将名称中包含120的所有文件重命名为现在为121。
  2. 您希望在特定目录中执行该操作,但希望从cmd上的任何位置运行该脚本。
  3. 当前脚本将在任何目录中运行,获取该目录中的所有子项,并将121替换为121.如果名称没有120,则无效。

    基于此,我建议进行2次修改 -

    1. 在gci中添加过滤器,仅获取名称中包含120的项目。
    2. 添加第一行以转到您需要运行脚本的目录。
    3. 以下是示例代码 -

      Set-location <dir>
      gci  -Filter "*120*" | % {rni $_.Name ($_.Name -replace '120', '121')}
      

答案 1 :(得分:1)

喜剧回答:

echo Hi

是一个批处理文件,它可以在任何目录中正常工作而不会出现错误&#34;,这就是你要求的字面意思。

半答案,这是一个批处理文件,它将在当前文件夹中的文件中执行120到121的等效重命名,这是PowerShell所做的,这似乎是你要求的:

@echo off
setlocal ENABLEDELAYEDEXPANSION

for %%f in (*120*) do (
 set _f=%%f
 ren "%%f" "!_f:120=121!"
) 

虽然您询问批处理文件并标记了有关批处理文件的问题,但我怀疑这不是您想要的。也许你的意思是&#34;我怎样才能指定它运行的目录?&#34;那么也许这个:

powershell -C "gci '%1' | % {rni $_.Name ($_.Name -replace '120', '121')}"

如果将此文件另存为要从命令提示符运行的批处理文件,则%1是您为批处理文件提供的参数,该文件嵌入在PowerShell代码中,引用为gci的输入。然后你可以运行myscript.bat "c:\data files"来启动PowerShell并重命名&#34; c:\ data files \&#34;中的文件。

或许,如果你问的更多关于&#34;没有错误&#34;部分来自你的标题,那么你需要接受你可能没有权限列出文件夹内容,或重命名文件的权限,或重命名文件可能会导致冲突名称,在这种情况下你需要的是添加

`-ErrorAction -Ignore`

到gci和rni,从某种意义上说,这将使他们&#34;无误地运行&#34;

认真回答:%是批处理文件中的特殊字符,您需要通过编写两次来转义它。

powershell -C "gci | %% {rni $_.Name ($_.Name -replace '120', '121')}"

否则它会被吞下并且你得到错误&#34;表达式只允许作为管道的第一个元素。&#34;

NB。您正在尝试重命名文件夹中的每个文件,无论名称中是否有120,这都很糟糕。按照Nikhil Gupta关于如何避免这样做的建议。