Несколько переменных в пути - PullRequest
0 голосов
/ 14 декабря 2018

Я планирую использовать следующий сценарий, просматривая текстовый файл, чтобы установить переменные для местоположения исходного PDF, и указать путь для создания новой папки (с номером недели), в которую нужно переместить исходный PDF.

$pdfSource = 'C:\path\in\text\file'
$newFolder = 'C:\path\to\newfolder\in\text\file'
Get-ChildItem $pdfSource '*.pdf' -Recurse | foreach {
    $x = $_.LastWriteTime.ToShortDateString()
    $new_folder_name = Get-Date $x -UFormat %V
    $des_path = "C:\path\to\newfolder\$new_folder_name"

    if (Test-Path $des_path) {
        Move-Item $_.FullName $des_path
    } else {
        New-Item -ItemType Directory -Path $des_path
        Move-Item $_.FullName $des_path
    }
}

Я не могу понять синтаксис строки ниже, чтобы включить переменную пути $newFolder вместе с существующим $new_folder_name, который я создаю.

$des_path = "C:\path\to\newfolder\$new_folder_name"

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Нет ничего плохого в вашем подходе к раскрытию строки (интерполяция):

$new_folder_name = 'foo' # sample value
$des_path = "C:\path\to\newfolder\$new_folder_name" # use string expansion

возвращает строковый литерал C:\path\to\newfolder\foo, как и ожидалось.

Ответ Адама показывает вам альтернативы построению путей к файлам, причем Join-Path является наиболее надежным и PowerShell-идиоматическим, хотя и медленным.
Другой вариант - использовать [IO.Path]::Combine():

[IO.Path]::Combine('C:\path\to\newfolder', $new_folder_name)

Способ вычисления значения для $new_folder_name должен быть проблематичным, если ваша текущая культура не en-US (США-английский), но из-за ошибки на самом деле не«т [1] ;в любом случае это должно быть упрощено:

Вместо:

$x = $_.LastWriteTime.ToShortDateString()
$new_folder_name = Get-Date $x -uformat %V

используйте:

$new_folder_name = Get-Date $_.LastWriteTime -uformat %V

То есть, передайте $_.LastWriteTime напрямую в Get-Date, в качестве экземпляра [datetime] - обхода через строковое представление не требуется.


[1] .ToShortDateString() возвращает строковое представление, чувствительное к культуре , тогда как PowerShell обычно использует инвариантную культуру для обеспечения согласованности между культурами;поэтому, если вы передаете string параметру, который принимает экземпляр [datetime], то должны распознаваться только форматы культуры invariant , а не текущий культуры.Хотя это верно для функций , написанных на PowerShell , в скомпилированных командлетах (обычно на C #), культура current неожиданно применяется;хотя это ошибка , было принято решение не исправлять ее ради обратной совместимости - см. эту проблему GitHub

0 голосов
/ 14 декабря 2018

Опция-1:

$des_path = "${newFolder}\${new_folder_name}"

Опция-2:

$des_path = "${0}\${1}" -f $newFolder, $new_folder_name

Опция-3:

$des_path = $newFolder + $new_folder_name

Опция-4:

$des_path = Join-Path -Path $newFolder -ChildPath $new_folder_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...