我有一个可以在其他服务器上正常运行的脚本,但是在这台服务器上,它正在脚本应运行的父目录中运行。它仅在这台机器上,并且在其他地方正常工作。
脚本:
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:的根。
答案 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)
您可以在各个方面简化脚本,
\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
}