Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用顺序数字后缀批量重命名PowerShell中的文件_Powershell - Fatal编程技术网

使用顺序数字后缀批量重命名PowerShell中的文件

使用顺序数字后缀批量重命名PowerShell中的文件,powershell,Powershell,我有14000张照片按年份和月份分类成文件,但使用多个摄像头拍摄,我希望文件名反映拍摄日期。例如,1998年10月16日图片位于名为1998\10月10日\19981016的文件夹中 我希望所有图片都命名为19981016\u 0001 19981016\u 0002等。我尝试了多种建议,但都没有成功 我可以看到它列出了我想更改的文件夹,但实际上我无法更改它。我所有的照片都是.jpg 尝试 我创建了一个临时副本文件,以防搞砸。我首先键入cd“C:\Documents and Settings\B

我有14000张照片按年份和月份分类成文件,但使用多个摄像头拍摄,我希望文件名反映拍摄日期。例如,1998年10月16日图片位于名为1998\10月10日\19981016的文件夹中

我希望所有图片都命名为19981016\u 0001 19981016\u 0002等。我尝试了多种建议,但都没有成功

我可以看到它列出了我想更改的文件夹,但实际上我无法更改它。我所有的照片都是.jpg

尝试 我创建了一个临时副本文件,以防搞砸。我首先键入
cd“C:\Documents and Settings\Brooke LastName\Desktop\Temp”
,然后在成功加载文件后,我使用了在这个论坛上找到的公式

ls *jpg | Foreach {$i=1} {Rename-Item _ -NewName ("$($.19981016){0:00000000#} .jpg" -f $i++) -whatif}
我所犯的错误

Unexpected token ' .19981016' in expression or statement.

At line:1 char:12 + $.19981016 <<<<
表达式或语句中的“
意外标记”.19981016”。

在第1行char:12+$.19981016中,语法有点偏离。几个问题:

  • 我不确定
    $($.19981016)
    打算产生什么,但是$()计算括号中的表达式并将结果插入字符串,您会得到错误,因为
    $.19981016
    不是有效的表达式。对于目录中的每个.jpg文件,都会重复此错误
  • 格式化字符串中的
    {0:00000000}
    将创建一个由9位数字组成的零填充数字,但较短的方法是
    {0:D9}
    。但是,我认为您希望零填充数字有4位数字,因此应该是
    {0:0000}
    {0:D4}
  • 我不确定
    Foreach{$I=1}{[…]
    应该做什么。关键字Foreach可以表示Foreach循环,也可以是Foreach对象的简写。在这种情况下,从管道接收输入,必然是后者,但这种语法无论如何都是不正确的
如果我正确理解描述,这将满足您的要求:

$i = 1
Get-ChildItem *.jpg | %{Rename-Item $_ -NewName ('19981016_{0:D4}.jpg' -f $i++)}
文件名将是19981016_0001.jpg19981016_0002.jpg19981016_0003.jpg,等等

请注意:

  • 您说过您想要像19981016\u 0001这样的文件名,但我假设您想要保留.jpg扩展名
  • 您需要初始化$i,否则,如果尚未定义它,它将从0开始,或者更糟糕的是,如果以前在同一PowerShell会话中使用了$i,它将从其他数字开始。例如,如果目录中有1432.jpg文件,则首先使用-WhatIf运行命令,然后运行如果是真的,数字将从1432开始
  • $i++$i增加1。但是,如果将其用作值,则在读取该值后它将增加;这就是为什么如果$i未定义,它将从0开始
  • Get ChildItemls相同。我使用了本机PowerShell名称,但它们可以互换(lsdirgci都是Get ChildItem的别名)
  • %{}是每个对象的缩写

这接近原始问题。您实际上可以将脚本块数组传递给foreach对象-进程,如文档所述(几乎没有)。我只在Bruce Payette的书中知道这一点。包含的文件夹名为“19981016”。源文件名可能与您期望的顺序不符

ls *jpg | 
Foreach {$i=1} {Rename-Item $_ -NewName ("$($_.directory.name)_{0:000#}.jpg" -f
  $i++) -whatif}


What if: Performing the operation "Rename File" on target "Item: C:\users\js\19981016\file1.jpg Destination: C:\users\js\19981016\19981016_0001.jpg".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\19981016\file10.jpg Destination: C:\users\js\19981016\19981016_0002.jpg".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\19981016\file2.jpg Destination: C:\users\js\19981016\19981016_0003.jpg".
您可以在powershell ISE中使用此代码块。输出示例如下:

旧文件:

1232.gif asd.gif

运行后代码:

文件_1232.gif
file_asd.gif

非常有用!感谢您提供的详细信息。.在哪里可以找到完整的文档?:/I无法找到准确的文章,但此线程,谢谢!@f00bar文档用于什么方面?此答案涵盖多个主题。如果您指的是批量文件重命名的文档,则没有任何文档,因为它不是真正的离散文档主题,而不是使用Rename Item将文件名馈送到循环的基本思想。有关如何创建新名称的文档将特定于您要执行的任何操作。例如,大多数批量重命名都将使用正则表达式替换来完成,此处甚至不涉及这些替换。在这种情况下,您将查找文档关于将是正则表达式替换,而不是批量文件重命名…如果您想了解字符串格式,官方术语是“复合格式字符串”,但您可以通过谷歌搜索“.net格式字符串”或“powershell格式字符串”或“powershell-f运算符”来获得更简洁直观的文档@AdiInbar谢谢你
:)
,我在查找目录文件列表和字符串替换格式的详细信息时遇到了麻烦。我有一个类似的情况,我想知道如何才能生成只有奇数的序列,例如
19981016_0001.jpg,19981016_0003.jpg,19981016_0005.jpg,
?是的因为我有一个扫描文件,其中一个目录中有奇数页,另一个目录中有偶数页。
$path="C:\..."
$files=Get-ChildItem $path -Filter *.gif  
Foreach($obj in $files){
   $pathWithFilename=$path + $obj.Name;
   $newFilename= "file_"+$obj.Name; 

   Rename-Item -Path $pathWithFilename -NewName $name
}