Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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
Windows 7 Powershell是否在目录树任何部分中放置的新文件上重命名文件?_Windows 7_Powershell_Scheduled Tasks_Sftp - Fatal编程技术网

Windows 7 Powershell是否在目录树任何部分中放置的新文件上重命名文件?

Windows 7 Powershell是否在目录树任何部分中放置的新文件上重命名文件?,windows-7,powershell,scheduled-tasks,sftp,Windows 7,Powershell,Scheduled Tasks,Sftp,我从未使用过Powershell(或VBScript),因为我是IT管理员的新手,希望能得到一些重命名文件的指导 每天,我都会使用Filezilla手动从SFTP连接下载文件到名为YYYYMMDD的本地目录filder(尽管稍后,我会希望编写一个自动任务,定期完成此任务)。我想设置的是一种任务,当文件到达distinion目录时,它们会被重命名 对于今天的下载,我想重命名以下文件: Original Name Renamed Filename wcm14444

我从未使用过Powershell(或VBScript),因为我是IT管理员的新手,希望能得到一些重命名文件的指导

每天,我都会使用Filezilla手动从SFTP连接下载文件到名为YYYYMMDD的本地目录filder(尽管稍后,我会希望编写一个自动任务,定期完成此任务)。我想设置的是一种任务,当文件到达distinion目录时,它们会被重命名

对于今天的下载,我想重命名以下文件:

Original Name                   Renamed Filename
wcm14444.csv.11.10.20_09.32     wcm14444_111020_0932.csv
wcm14444.csv.11.10.21_00.09     wcm14444_111021_0009.csv
wcm14444.pdf.11.10.20_09.32     wcm14444_111020_0932.pdf
wcm14444.pdf.11.10.21_00.10     wcm14444_111021_0010.pdf
wcm1cash.csv.11.10.21_00.56     wcm1cash_111021_0056.csv
wcm1money.csv.11.10.21_00.56    wcm1money_111021_0056.csv
wcm1opnpos.csv.11.10.21_00.56   wcm1opnpos_111021_0056.csv
wcm1trades.csv.11.10.21_00.56   wcm1trades_111021_0056.csv
wcm1_an.pdf.11.10.21_03.26      wcm1_an_111021_0326.pdf
wcm1_ds.pdf.11.10.21_00.22      wcm1_ds_111021_0022.pdf
wcm1_ep.csv.11.10.21_03.26      wcm1_ep_111021_0326.csv
wcm1_ms.pdf.11.10.21_03.26      wcm1_ms_111021_0326.pdf
您将在我的重命名要求中注意到: 1.文件扩展名出现在文件名的中间,并被放置到最后。 2.我将“.”替换为“”,它们显示为日期分隔符。如果有任何帮助,我只希望收到文件类型为(“.csv”、“.pdf”、“.xls”)的文件,如果这些文件出现在文件名中,它们将被替换为“\ux”

目前我会使用Excel来执行任务,但这似乎很难部署为系统任务?这似乎更像是Powershell的任务

如果我正在创建YYYYMMDD文件夹,例如N:\SFTP\Provider1\YYYYMMDD,那么当文件下载到每天的YYYYMMDD中时,自动重命名文件的最佳方法是什么(注意,在同一天,可能没有创建文件夹,因为没有新文件)。 非常感谢和亲切的问候, 伯蒂


谢谢大家的帮助。更多信息请访问本页,以了解那些跌跌撞撞的用户。我现在已经在N:\SFTP\Provider1\N创建了一个renamesftp.ps1文件,其中包含

$pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'
$todayDate = Get-Date -Format "yyyyMMdd"

Get-ChildItem (".\" + $todayDate + "\") -Recurse | Foreach-Object{
    if($_.Name -match $pattern)
    {
        echo $NewName
        $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
        Rename-Item (".\" + $todayDate + "\" + $_) -NewName $NewName
    }
}
powershell .\Rename_SFTP.ps1
然后,我创建了一个RunRenameTaskForToday.bat,其中包含

$pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'
$todayDate = Get-Date -Format "yyyyMMdd"

Get-ChildItem (".\" + $todayDate + "\") -Recurse | Foreach-Object{
    if($_.Name -match $pattern)
    {
        echo $NewName
        $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
        Rename-Item (".\" + $todayDate + "\" + $_) -NewName $NewName
    }
}
powershell .\Rename_SFTP.ps1
至少这样,当我手动下载文件时,我所需要做的就是双击一个更高级别的.bat文件,它就会找到需要重命名文件的正确文件夹。我所需要知道的就是找到一种方法来自动删除SFTP的内容


谢谢大家。

这是一项相当复杂的任务,有几个问题(很可能还有几个解决方案)。以下是一些指导原则,可以帮助您继续:

  • 使用
    Get ChildItem | Foreach Item
    遍历所有文件。
    $\uu
    保存当前项
  • Powershell非常支持,请使用
    if($\u-match“regexp”)
    。我倾向于命名匹配项,以便于识别它们。类似的内容可能适用于您的特定命名格式:

    if($s-match“(?*)\(?csv | pdf)(?*)\u(?\ d{2})\(?\d{2})”{
    $newname=$matches[“pre”]+“”+
    ($matches[“date”]-替换“\。”,“”)+
    “”+$matches[“hour”]+$matches[“min”]+
    '.+$matches[“ext”]
    }

  • 要获取当前日期,请使用
    get Date-Format“yyyyymmdd”
    。使用它每天创建一个新文件夹


    • 这是一项相当复杂的任务,有几个问题(很可能还有几个解决方案)。以下是一些指导原则,可以帮助您继续:

      • 使用
        Get ChildItem | Foreach Item
        遍历所有文件。
        $\uu
        保存当前项
      • Powershell非常支持,请使用
        if($\u-match“regexp”)
        。我倾向于命名匹配项,以便于识别它们。类似的内容可能适用于您的特定命名格式:

        if($s-match“(?*)\(?csv | pdf)(?*)\u(?\ d{2})\(?\d{2})”{
        $newname=$matches[“pre”]+“”+
        ($matches[“date”]-替换“\。”,“”)+
        “”+$matches[“hour”]+$matches[“min”]+
        '.+$matches[“ext”]
        }

      • 要获取当前日期,请使用
        get Date-Format“yyyyymmdd”
        。使用它每天创建一个新文件夹


        • 很快就会有一种叫做砖块的东西

          $pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'
          
          
          Get-ChildItem D:\temp -Recurse | Foreach-Object{
              if($_.Name -match $pattern)
              {
                  $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
                  Rename-Item $_ -NewName $NewName
              }
          }
          

          很快就有一种叫做砖块的东西

          $pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'
          
          
          Get-ChildItem D:\temp -Recurse | Foreach-Object{
              if($_.Name -match $pattern)
              {
                  $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
                  Rename-Item $_ -NewName $NewName
              }
          }
          

          下面是使用格式字符串创建新名称的另一种方法。括号中的每组模式字符表示要捕获的文件名的一部分,稍后在$NewName中使用以形成新文件名:


          下面是使用格式字符串创建新名称的另一种方法。括号中的每组模式字符表示要捕获的文件名的一部分,稍后在$NewName中使用以形成新文件名: