Сценарий Powershell не создает папку с помощью функции mkdir

#powershell

#powershell

Вопрос:

Я хочу создавать ежедневные папки с помощью сценария Powershell, и хотя первые 2 папки создаются без проблем, третья папка в моем списке не создается. Ниже приведен мой код, и по какой-то причине не создается папка Raw Data — есть предложения относительно того, почему это может происходить?

 $months = Get-Date -UFormat %b
$monthl = Get-Date -UFormat %B
$year = Get-Date -UFormat %Y
$timestamp = Get-Date -UFormat "%d%m%Y"
$folderstamp = Get-Date -UFormat "%d-%m-%Y"

mkdir "X:Client Services amp; FulfilmentFulfilmentCMS$year$monthl $yearInvestec_AML$folderstamp"
mkdir "X:Client Services amp; FulfilmentFulfilmentCMS$year$monthl $yearInvestec_AML$folderstampFinal Output"
mkdir "X:Client Services amp; FulfilmentFulfilmentCMS$year$monthl $yearInvestec_AML$folderstampRaw Data"
  

Если я запишу эту строку кода в самой Powershell, она вернет дату LastWriteTime 01/01/1601?! Смотрите ссылку на скриншот ниже. Режим, похоже, показывает все возможные доступные режимы?

скриншот powershell

Комментарии:

1. 1601-01-01 — это просто «нулевое» время NTFS, т.е. LastWriteTime просто не установлено. Я не знаю о возможности отключить это явно, но X: предполагает, что вы все равно находитесь на подключенном диске. Это может быть артефакт сетевого стека. Вывод предполагает, что папка была создана — для уверенности выполните dir следующие действия. Если она даже не была создана, вы столкнулись с какой-то ошибкой (недопустимое имя, слишком длинное имя?) по какой-то причине это не передается в ОС — опять же, нередкий артефакт сетевых стеков. Попробуйте просто cmd и mkdir у него должна возникнуть та же проблема.

2. Я проверил каталог, и папка с необработанными данными не отображается. Использование обычного cmd и mkdir возвращает следующее: подкаталог или файл X:Client Службы и выполнение FulfillmentCMS2019March 2019Investec_AML 15-03-2019 Raw Data уже существуют, но фактическая папка вообще не отображается? Я не думаю, что имя слишком длинное, или оно не должно быть таким при создании конечной выходной папки

3. Возможно, она уже существует и не отображается в списке каталогов в результате кэширования. Это удаленный общий ресурс SMB? Вы могли бы попробовать отключить и повторно подключиться.

4. Я не уверен, почему, но использование символа подчеркивания вместо пробела в новом имени каталога работает нормально (Raw_Data) … это поможет мне, поскольку они создаются для управления данными, которые обрабатывает наша команда, и только наша команда. Спасибо за вашу помощь, Джерун!

Ответ №1:

На вашем скриншоте я вижу, что Raw Data папка действительно существует. В разделе Mode вы можете увидеть ее атрибуты:

 d - Directory
a - Archive
r - Read-only
h - Hidden
s - System
l - Reparse point, symlink, etc.
  

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

В любом случае, вот ваш код в более стиле PowerShell:

 $now         = Get-Date
$months      = $now.ToString("MMM")
$monthl      = $now.ToString("MMMM")
$year        = $now.Year
$timestamp   = $now.ToString("ddMMyyyy")
$folderstamp = $now.ToString("dd-MM-yyyy")

$folderName = "X:Client Services amp; FulfilmentFulfilmentCMS$year$monthl $yearInvestec_AML$folderstamp"
try {
    New-Item -ItemType Directory -Path $folderName -ErrorAction Stop | Out-Null
    New-Item -ItemType Directory -Path (Join-Path -Path $folderName -ChildPath 'Final Output') -ErrorAction Stop | Out-Null
    New-Item -ItemType Directory -Path (Join-Path -Path $folderName -ChildPath 'Raw Data') -ErrorAction Stop | Out-Null
}
catch {
    Write-Error $_.Exception.Message
}
  

Надеюсь, это поможет

Комментарии:

1. Я думаю, это моя вина, я нажал на галочку ниже, и значение изменилось с 0 на -1… Я думал, что щелчок по галочке привел бы к обратному результату?

2. @chillery А, тогда все в порядке. Мне просто не нравятся (особенно downvoters), которые делают это без указания причины. Если вы хотите отменить это, щелкнув треугольником вверх, это было бы здорово.

3. Извини, Тео, при попытке внести изменения я получаю следующее: Спасибо за отзыв! Голоса, поданные лицами с репутацией менее 15, записываются, но не изменяют публично отображаемую оценку публикации. Я только на 8, поэтому не уверен, как это исправить для вас

4. @chillery Ну, неважно, ничего страшного. Здесь важно то, что код работает для вас.

Ответ №2:

По какой бы то ни было причине (возможно, из-за слова Raw?), замена пробела в новом имени каталога подчеркиванием сработала, т. Е. ‘Raw_Data’ вместо ‘Raw Data’, поэтому я применю это для других ежедневных заданий, которые мы обрабатываем, использующих аналогичную структуру папок.

Спасибо Тео за более аккуратный код!

 $now         = Get-Date
$months      = $now.ToString("MMM")
$monthl      = $now.ToString("MMMM")
$year        = $now.Year
$timestamp   = $now.ToString("ddMMyyyy")
$folderstamp = $now.ToString("dd-MM-yyyy")

$folderName = "X:Client Services amp; FulfilmentFulfilmentCMS$year$monthl $yearInvestec_AML$folderstamp"
try {
New-Item -ItemType Directory -Path $folderName -ErrorAction Stop | Out-Null
New-Item -ItemType Directory -Path (Join-Path -Path $folderName -ChildPath 'Final_Output') -ErrorAction Stop | Out-Null
New-Item -ItemType Directory -Path (Join-Path -Path $folderName -ChildPath 'Raw_Data') -ErrorAction Stop | Out-Null
}
catch {
Write-Error $_.Exception.Message
}