Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
function Copy-Unique {
# Copies files to a destination. If a file with the same name already exists in the destination,
# the function will create a unique filename by appending '(x)' after the name, but before the extension.
# The 'x' is a numeric sequence value.
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
[Alias("Path")]
[ValidateScript({Test-Path -Path Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
function Copy-1 {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, Position = 0)]
[Alias("Path")]
[ValidateScript({Test-Path -Path Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
[111] и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
-PathType Container})]
[string]$Source,
[Parameter(Mandatory = $true, Position = 1)]
[string]$Destination,
[Parameter(Mandatory = $true, Position = 2)]
[int]$Threshold,
[string]$Filter = '*'
)
# you are not showing this function, so I have to assume it does what it needs to do
$remainingSpace = Get-FreeSpace
if($remainingSpace -gt $Threshold) {
Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose
}
else {
$answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit."
if ($answer -ne 'Q') {
# you have cleared space, and want to redo the copy action
Copy-1 -Source $Source -Destination $Destination -Filter $Filter
}
}
}
и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
-PathType Container})]
[string]$SourceFolder,
[Parameter(Mandatory = $true, Position = 1)]
[string]$DestinationFolder,
[Parameter(Mandatory = $false, Position = 2)]
[string]$Filter = '*',
[switch]$Recurse
)
# create the destination path if it does not exist
if (!(Test-Path -Path $DestinationFolder -PathType Container)) {
Write-Verbose "Creating folder '$DestinationFolder'"
New-Item -Path $DestinationFolder -ItemType 'Directory' -Force | Out-Null
}
# get a list of file FullNames in this source folder
$sourceFiles = @(Get-ChildItem -Path $SourceFolder -Filter $Filter -File | Select-Object -ExpandProperty FullName)
foreach ($file in $sourceFiles) {
# split each filename into a basename and an extension variable
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($file)
$extension = [System.IO.Path]::GetExtension($file) # this includes the dot
# get an array of all filenames (names only) of the files with a similar name already present in the destination folder
$allFiles = @(Get-ChildItem $DestinationFolder -File -Filter "$baseName*$extension" | Select-Object -ExpandProperty Name)
# for PowerShell version < 3.0 use this
# $allFiles = @(Get-ChildItem $DestinationFolder -Filter "$baseName*$extension" | Where-Object { !( Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
function Copy-1 {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, Position = 0)]
[Alias("Path")]
[ValidateScript({Test-Path -Path Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
[111] и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
-PathType Container})]
[string]$Source,
[Parameter(Mandatory = $true, Position = 1)]
[string]$Destination,
[Parameter(Mandatory = $true, Position = 2)]
[int]$Threshold,
[string]$Filter = '*'
)
# you are not showing this function, so I have to assume it does what it needs to do
$remainingSpace = Get-FreeSpace
if($remainingSpace -gt $Threshold) {
Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose
}
else {
$answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit."
if ($answer -ne 'Q') {
# you have cleared space, and want to redo the copy action
Copy-1 -Source $Source -Destination $Destination -Filter $Filter
}
}
}
и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
.PSIsContainer) } | Select-Object -ExpandProperty Name)
# construct the new filename
$newName = $baseName + $extension
$count = 1
while ($allFiles -contains $newName) {
$newName = "{0}({1}){2}" -f $baseName, $count, $extension
$count++
}
# use Join-Path to create a FullName for the file
$newFile = Join-Path -Path $DestinationFolder -ChildPath $newName
Write-Verbose "Copying '$file' as '$newFile'"
Copy-Item -Path $file -Destination $newFile -Force
}
if ($Recurse) {
# loop though each subfolder and call this function again
Get-ChildItem -Path $SourceFolder -Directory | Select-Object -ExpandProperty Name | ForEach-Object {
$newSource = (Join-Path -Path $SourceFolder -ChildPath Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
function Copy-1 {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, Position = 0)]
[Alias("Path")]
[ValidateScript({Test-Path -Path Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
[111] и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
-PathType Container})]
[string]$Source,
[Parameter(Mandatory = $true, Position = 1)]
[string]$Destination,
[Parameter(Mandatory = $true, Position = 2)]
[int]$Threshold,
[string]$Filter = '*'
)
# you are not showing this function, so I have to assume it does what it needs to do
$remainingSpace = Get-FreeSpace
if($remainingSpace -gt $Threshold) {
Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose
}
else {
$answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit."
if ($answer -ne 'Q') {
# you have cleared space, and want to redo the copy action
Copy-1 -Source $Source -Destination $Destination -Filter $Filter
}
}
}
и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
)
$newDestination = (Join-Path -Path $DestinationFolder -ChildPath Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
function Copy-1 {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, Position = 0)]
[Alias("Path")]
[ValidateScript({Test-Path -Path Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
[111] и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
-PathType Container})]
[string]$Source,
[Parameter(Mandatory = $true, Position = 1)]
[string]$Destination,
[Parameter(Mandatory = $true, Position = 2)]
[int]$Threshold,
[string]$Filter = '*'
)
# you are not showing this function, so I have to assume it does what it needs to do
$remainingSpace = Get-FreeSpace
if($remainingSpace -gt $Threshold) {
Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose
}
else {
$answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit."
if ($answer -ne 'Q') {
# you have cleared space, and want to redo the copy action
Copy-1 -Source $Source -Destination $Destination -Filter $Filter
}
}
}
и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
)
Copy-Unique -SourceFolder $newSource -DestinationFolder $newDestination -Filter $Filter -Recurse
}
}
}
Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
function Copy-1 {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, Position = 0)]
[Alias("Path")]
[ValidateScript({Test-Path -Path Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.
Для этого эта функция может оказаться полезной:
[110] Я бы также предложил некоторые изменения в вашей функции Copy-1
для использования вышеуказанной функции Copy-Unique
:
[111] и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
ПРИМЕЧАНИЕ Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
-PathType Container})]
[string]$Source,
[Parameter(Mandatory = $true, Position = 1)]
[string]$Destination,
[Parameter(Mandatory = $true, Position = 2)]
[int]$Threshold,
[string]$Filter = '*'
)
# you are not showing this function, so I have to assume it does what it needs to do
$remainingSpace = Get-FreeSpace
if($remainingSpace -gt $Threshold) {
Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose
}
else {
$answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit."
if ($answer -ne 'Q') {
# you have cleared space, and want to redo the copy action
Copy-1 -Source $Source -Destination $Destination -Filter $Filter
}
}
}
и затем используйте его так:
Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'
Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь
От Отражателя мы видим:
if (validateImageData)
{
num = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, zero));
if (num != 0)
{
SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, zero));
throw SafeNativeMethods.Gdip.StatusException(num);
}
}
Таким образом, мы видим, что GdipImageForceValidation называют (отзыв, Система. Рисунок является просто оберткой по GDI +). Документация для этой функции не очень хороша:
Эта функция вызывает проверку изображения.
Не очень полезный. Однако мнение высказано - файл изображения опрошен, чтобы гарантировать, что безопасно загрузиться. Это может заставить целое изображение быть загруженным в память.
Если бы Вы принимаете исходные данные от пользователей, я, конечно, установил бы этот флаг на истинный - Вы никогда не знаете, какие файлы (уродливый или иначе) пользователи загрузят.Береженого Бог бережет. Поэтому значение по умолчанию true
.
Обратите внимание также, что GDI + не рекомендуется для серверных сред. Вы - более обеспеченное использование System.Windows.Media.Imaging
.
Путем просматривания в отражателе Вы будете видеть, что.NET по умолчанию всегда называет встроенный API в библиотеках GDI + под названием GdipImageForceValidation (который является путем передачи верный для validateImageData параметра). Я не могу узнать много о встроенном API в MSDN, только это, которое говорит нам не больше, чем название самой функции. Однако кажется, что этот метод вызывает снижение производительности на основе сообщения Justin Roger о загрузке изображений самым быстрым способом через.NET. Это также интуитивно, чтобы ожидать, что любой шаг "проверки" отнял бы у производительности.
Однако при определении лжи для validateImageData параметра.NET явно инициирует неуправляемая безопасность кода спрос, означая, что авторы платформы решили, что принуждение проверки изображения было необходимо для создания обещания управляемого кода, являющегося безопасным, и в конечном счете способность доверять данным, которые, как вызывающая сторона говорит, представляют изображение. Таким образом, в то время как определение flase для validateImageData может увеличить производительность в less-than-full-trust контексте защиты, это может генерировать исключение, и необходимо доверять данным, Вы думаете, изображение.
Я не забываю читать некоторые проблемы с тем параметром. См. это сообщение (это довольно старо, но только быть осторожным).
Почему не только пытаются видеть то, что происходит с тем набором флага и не набором?
В любом случае необходимо обработать любые исключения, которые могли бы быть выданы.