I have an issue with moving a file that contains spaces.
This is the example path: $transfer.FileName = D:\this\is\a\file with a lot of spaces.xml
$file = $transfer.FileName
Move-Item -path $file -Destination $archiveFolder
Error:
Move-Item : Illegal characters in path.
At line:1 char:17
Move-Item -path $file -Destination $archiveFolder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidArgument: (D:\this\i...ong 2022-08.xml:FileInfo) [Move-Item], ArgumentException
FullyQualifiedErrorId : MoveFileInfoItemArgumentError,Microsoft.PowerShell.Commands.MoveItemCommand
When i run test-path $file I receive $true. I have tried replacing the spaces with "` " but after that i got a new error saying that the path was not correct.
Does someone know how I can fix this?
CodePudding user response:
Your problem isn't with the input file, $file, but with the destination path, $archiveFolder:
The error message implies that $archiveFolder contains characters that are illegal in a file-system path, namely (on Windows) * ? < > | and, except as part of a drive spec such as C:, :.
Note that Move-Item's -Destination parameter does not support wildcard expressions.
Therefore:
If the value is meant to be a literal path, remove the illegal character and try again.
If the value is a wildcard expression, resolve it to a literal path first, and ensure that it resolves to just one literal path:
# Resolve the presumed wildcard pattern in $archiveFolder # to a full, literal path. $archiveFolderLiteral = Resolve-Path $archiveFolder if ($archiveFolderLiteral.Count -ne 1) { throw "Wildcard expression `"$archiveFolder`" did not resolve to a single, literal path." } # Also note the use of -LiteralPath instead of -Path - see below. Move-Item -LiteralPath $file -Destination $archiveFolderLiteral
As for the input path:
As long as you quote a path that contains spaces (or other metacharacters) (e.g. 'D:\this\is\a\file with a lot of spaces.xml'),[1] it is correctly passed as a single argument to the target command.
However, there's an additional consideration with respect to file-processing cmdlets:
Their
-Pathparameter (which is also the default parameter if you pass a path positionally as the first argument) expects wildcard expressions, which means that a path that contains[and]that is meant to be a literal path gets misinterpreted.Thus, for full robustness, it is best to use the
-LiteralPathparameter explicitly whenever your paths are literal ones rather than wildcards.
[1] When passing paths directly as arguments (as opposed to storing them in a variable with $path = ... first), you may alternatively escape individual metacharacters with `, though with multiple spaces, for instance, that becomes cumbersome; e.g., to pass verbatim test file 1: Write-Output test` file` 1
CodePudding user response:
I was not able to replicate your issue.
$filename = "D:\Desktop\New folder\New Text Document.txt"
$archiveFolder = "D:\Desktop\New folder\temp"
Move-Item -path $filename -Destination $archiveFolder
No error returned and the file was moved. Are you enclosing the filename with double quotes?
