PowerShell脚本在错误的目录中运行

时间:2018-11-27 18:31:12

标签: powershell

我有一个可以在其他服务器上正常运行的脚本,但是在这台服务器上,它正在脚本应运行的父目录中运行。它仅在这台机器上,并且在其他地方正常工作。

脚本:

Param (
    [Parameter(Mandatory=$true)][string]$destinationRoot,
    [string]$localPath
)

Get-ChildItem $localPath\* -Include *.bmp, *.svg |
    Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} |
    ForEach-Object {
        $content = $localPath + "\" + $_.Name

        $year = (Get-Item $content).LastWriteTime.Year.ToString()
        $monthNumber = (Get-Item $content).LastWriteTime.Month
        $month = (Get-Culture).DateTimeFormat.GetMonthName($monthNumber)

        $destination = $destinationRoot + "\" + $year + "\" + $month 

        New-Item -ItemType Directory -Force -Path $destination

        Move-Item -Path $content -Destination $destination -Force
    }

这是CMD提示符下的执行语句:

powershell -File "C:\L1_Vision_Images\MoveFiles.ps1" -destinationRoot "\\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images\" -localPath "C:\L1_Vision_Images"

不是复制L1_Vision_Images目录中的内容,而是扫描C:的根。

2 个答案:

答案 0 :(得分:3)

参数-destinationRoot的参数中的尾部反斜杠转义了右引号,这意味着您传递的是\\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images\而不是\\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images" -localPath C:\admin\scripts

仅在调试器中检查参数值或在脚本开头将其输出(例如,通过Write-Host $destinationRoot进行输出)就会显示出来。

从该参数中删除结尾的反斜杠(由于在定义$destination时仍要附加反斜杠,因此不需要),问题将消失。

powershell -File "C:\L1_Vision_Images\MoveFiles.ps1" -destinationRoot "\\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images" -localPath "C:\L1_Vision_Images"

答案 1 :(得分:1)

您可以在各个方面简化脚本,

  • $ content与$ _。FullName相同,
  • $ _已作为具有所有属性的对象存在,
    因此无需多次为LastWriteTime调用Get-Item
  • 您可以使用\year\monthname构建.ToString('\\yyyy\\MMMM')文件夹
    (将反斜杠转义为另一个反斜杠即可得到字面意思)

Param (
    [Parameter(Mandatory=$true)][string]$destinationRoot,
    [string]$localPath
)

Get-ChildItem $localPath\* -Include *.bmp, *.svg |
    Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} |
    ForEach-Object {
        $destination = Join-Path $destinationRoot `
                       $_.LastWriteTime.ToString("\\yyyy\\MMMM")
        New-Item -ItemType Directory -Force -Path $destination
        $_ | Move-Item -Destination $destination -Force
    }